循环队列也是队列的顺序存储结构,只是在原先的队列的基础上进行的优化,我在写的时候出现了一些问题,但是我搜索的博客中都没有提到这个问题,
首先: 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; }
今日就这样结束了,日记结束。如果大家有什么问题欢迎提出来