• 数据结构循环队列(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;
    }

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

  • 相关阅读:
    第三第四周的笔记
    第一二周的笔记
    jQuery的一些笔记
    函数的执行环境与调用对象
    从click事件理解DOM事件流
    慕课编程题JS选项卡切换
    adb(11)-重新挂载 system 分区为可写
    adb(10)-屏幕截图/录制
    adb(9)-查看设备信息
    adb(8)-查看日志
  • 原文地址:https://www.cnblogs.com/qian-yi/p/12728223.html
Copyright © 2020-2023  润新知