
点击上方蓝字关注我!
如果有错误或者理解不到位的地方还请各位指正!
数据结构的相关问题,可以参考笔者写的系列数据结构文章,或者加我交流!
声明:以下内容是对清华大学出版社出版,由严蔚敏和吴伟民编著的图书《数据结构》(C语言版)的代码实现。
图书PDF版本可移步公众号【李歘歘】回复电子书领取。
上次说到了队列的顺序队列,今天我们来说一下有关队列的循环队列,相关知识点可以先了解一下。

书中位置(页码):P63-P65
函数定义及说明:
Status InitQueue(SqQueue &Q) //初始化int QueueLength(SqQueue Q) //返回队列长度Status EnQueue(SqQueue &Q,QElemType e) //入队Status DeQueue(SqQueue &Q,QElemType e) //出队Status QueueTraverse(SqQueue Q) //遍历void CrQueue(SqQueue &Q,int n) //创建栈,就是重复的将元素入栈(当然也可以单独写一个创建的函数)Status QueueEmpty(SqQueue Q) //判空Status GetHead(SqQueue Q,QElemType e) //获取队头元素Status ClearQueue(SqQueue &Q) //置空Status DestoryQueue(SqQueue &Q) //销毁
程序代码:
#include<cstdio>#include<cstdlib>#define QElemType int#define Status int#define MAXQSIZE 100 //最大队列长度using namespace std;/**说明:下面对MAXQSIZE取模的作用是将尾指针和头指针连接起来,*///队列的结构typedef struct {QElemType *base; //初始化的动态分配存储空间int front; //头指针,若队列不空,指向队列头元素int rear; //尾指针,若队列不空,指向队列尾元素的下一个位置}SqQueue;//初始化Status InitQueue(SqQueue &Q){Q.base = (QElemType *)malloc(MAXQSIZE*sizeof(QElemType));if(!Q.base){printf("内存分配失败\n");return 0;}Q.front = Q.rear = 0;return 0;}//返回队列长度int QueueLength(SqQueue Q){printf("链表长度为%d\n",(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE);return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}//入队Status EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1)%MAXQSIZE == Q.front){printf("队列已满\n");return 0;}Q.base[Q.rear] = e;Q.rear = (Q.rear + 1) % MAXQSIZE; //尾指针加1,当到达尾部时,循环到头指针,返回头指针return 0;}//出队Status DeQueue(SqQueue &Q,QElemType e){//判空if(Q.front == Q.rear){printf("队列为空\n");return 0;}e = Q.base[Q.front];Q.front = (Q.front + 1) % MAXQSIZE; //头加1,当到达头时,循环到尾指针,返回尾指针printf("元素%d出队\n",e);return 0;}//遍历Status QueueTraverse(SqQueue Q){printf("遍历开始:");for(int i=Q.front;i<Q.rear;i++){printf("%d ",Q.base[i]);}printf("\n");return 0;}//创建栈,就是重复的将元素入栈(当然也可以单独写一个创建的函数)void CrQueue(SqQueue &Q,int n){InitQueue(Q);for(int i=0;i<n;i++){int e;scanf("%d",&e);EnQueue(Q,e);}printf("创建成功\n");}//判空Status QueueEmpty(SqQueue Q){if(Q.front == Q.rear){printf("队列为空\n");return true;}else{printf("队列不为空\n");return false;}}//获取队头元素Status GetHead(SqQueue Q,QElemType e){if(Q.front == Q.rear){printf("队列为空\n");return 0;}e = Q.base[Q.front]; //队头元素之前有一个空的头结点printf("队头元素为:%d\n",e);return 0;}//置空Status ClearQueue(SqQueue &Q){Q.rear = Q.front;printf("置空操作成功\n");return 0;}//销毁Status DestoryQueue(SqQueue &Q){free(Q.base); //销毁连续空间Q.front = 0; //栈底指针赋空Q.rear = 0; //栈顶指针赋空printf("销毁成功");return 0;}int main(){int n;QElemType value1,value2;SqQueue Q;printf("请输入队列元素个数:");scanf("%d",&n);CrQueue(Q,n);GetHead(Q,value1);DeQueue(Q,value2);QueueTraverse(Q);ClearQueue(Q);QueueTraverse(Q);DestoryQueue(Q);return 0;}
运行结果:

「往 • 期 • 精 • 选」
这些经典排序,你必须掌握
最短路径——Dijkstra算法这一篇就够了


文章转载自编程Cookbook,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。





