zoukankan      html  css  js  c++  java
  • 数据结构循环队列(c语言描述)

      循环队列也是队列的顺序存储结构,只是在原先的队列的基础上进行的优化,我在写的时候出现了一些问题,但是我搜索的博客中都没有提到这个问题,

      首先: front是指向队列的第一个元素,rear是指向队尾的下一个元素,MAXSIZE是队列的最大容量 (首先我卖个关子,这里MAXSIZE的描述是错的)

          队列满条件:(front+1)%MAXSIZE=rear; 

          队列为空条件: front=rear;

          队列的长度:(rear-front+MAXSIZE)%MAXSIZE;

      但是按照我们自己的逻辑的时,队列满的条件是 :front=rear; 和老师的上述不同,在这个地方困扰了我很久,后来才知道:MAXSIZE=队列的容量+1,队列会牺牲一个空间,当队列满了,队头指针在队尾指针的下一个位置。搞懂了这个下面就比较容易了。

    所有的代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    
    #define MAXSIZE 6  //队列的最大长度+1,数组的其中一个元素空着。 
    typedef int ElemType;
    typedef struct Queue{
        ElemType *data;  //数组
        ElemType front;  //指向头部 
        ElemType rear;  //指向尾部的下一个元素(有数据的尾部)
    }Queue;
    
    //初始化循环队列 
    void initQueue(Queue *q)
    {
        q->data=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));  //为数组创建动态空间 
        q->front=q->rear=0; //队头和队尾都为0 
    }
    
    //入队列 
    void push(Queue *q,ElemType e)
    {
        if((q->rear+1)%MAXSIZE==q->front)  //队列空间满了 
        {
            printf("队列空间已满,无法入队
    ");
        }
        else
        {
            q->data[q->rear]=e;
            q->rear=(q->rear+1)%MAXSIZE;//获取队列的下一个坐标
        }
    }
    
    //出队列
    ElemType pop(Queue *q,ElemType *e)
    {
        if(q->front==q->rear)
        {
            printf("队列空间为空,无法出队
    ");
            return -1;
        }
        else
        {
            *e=q->data[q->front];
            q->front=(q->front+1)%MAXSIZE;
            return *e;
        }
    }
    
    //销毁队列
    void destroyQueue(Queue *q)
    {
        free(q->data);
        q->front=q->rear=0;
    }
    
    //打印队列
    void printfQueue(Queue q)
    {
        int length=(q.rear-q.front+MAXSIZE)%MAXSIZE;
        for(int i=0;i<length;i++)
        {
            printf("%d  ",q.data[q.front]);
            q.front=(q.front+1)%MAXSIZE; 
        }
        printf("
    ");
    }
    
    int main()
    {
        Queue q;//声明结构体对象
        int number;//指令
        int e;     // 数据
        initQueue(&q);//初始化
        
        printf("结束操作----------0
    ");
        printf("入队列操作----------1
    ");
        printf("出队列操作----------2
    ");
        printf("销毁队列操作----------3
    ");
        printf("打印操作----------4
    "); 
        printf("请输入你的指令:");
        scanf("%d",&number);
        
        while(number!=0)
        {
            switch(number)
            {
                case 1:
                    printf("请输入要入队列的值:");
                    scanf("%d",&e);
                    push(&q,e);
                    break;
                    
                case 2:
                    e=pop(&q,&e);
                    printf("出队列的值为:%d
    ",e);
                    break;
                    
                case 3:
                    destroyQueue(&q);
                    printf("队列已销毁");
                
                case 4:
                    printfQueue(q);
                    break;
                
                default:
                    printf("你输入的指令不正确
    ");
            }
            printf("你的指令为:");
            scanf("%d",&number);
        }
        return 0;
    }

      今日就这样结束了,日记结束。如果大家有什么问题欢迎提出来

  • 相关阅读:
    【Win 10 应用开发】在后台播放视频
    【Win 10 应用开发】UI Composition 札记(八):用 XamlLight 制作灯光效果
    【Win 10 应用开发】UI Composition 札记(七):基于表达式的动画
    【Win 10 应用开发】UI Composition 札记(六):动画
    Redis中的Scan命令的使用
    MySQL8.0新特性
    IP白名单的实现(PHP)
    mysql分组后获取每个组排序后的第一条数据(整行)
    PHP 之sha256 sha512封装
    Mysql数据库中CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP区别
  • 原文地址:https://www.cnblogs.com/qian-yi/p/12728223.html
Copyright © 2011-2022 走看看