循环队列的实现
来源:互联网 发布:java猜拳游戏源代码 编辑:程序博客网 时间:2024/06/03 19:24
正常使用队列都是直接用一组地址连续的存储单元依次存放,并用两个指针front和rear指示队列头元素和队列尾元素。但是如果只是这样来存放队列元素,容易引起数组的越界而遭致代码被破坏。
这时我们可以臆造一个环状的空间,但是如果通过Q.front == Q.rear方法是无法判断队列是为“空”还是“满”,所以我们需要找到一个方法去判断,这样便约定“队列头指针在队列尾指针的下一位置上”作为队列“满”的状态。
具体实现代码如下:
/* circular queue implementation Author: zzj Date : 17-6-13*/#include<cstdio>#include<cstdlib>using namespace std;const int MAXQSIZE = 5; /*定义队列的结构体*/ typedef struct{ int base[MAXQSIZE];//初始化动态分配存储空间,即为一数组,这里已经分配好地址 int front; //头指针,若队列不空,指向队列头元素 int rear; //尾指针,若队列不空,指向队列尾元素的下一个位置 }SqQueue;/*初始化一个空队列Q*/bool InitQueue(SqQueue &Q){ if(!Q.base) return false; Q.front = Q.rear = 0; return true; } /*返回队列Q的元素个数,即队列长度*/int QueueLength(SqQueue Q){ return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;//注意要加上队列容量,再取余 }/*入队*/bool EnQueue(SqQueue &Q, int e){ if((Q.rear + 1) % MAXQSIZE == Q.front) return false;//Q已满 Q.base[Q.rear] = e; Q.rear = (Q.rear + 1) % MAXQSIZE;//注意要取余,比如队列的最大容量为5,假如rear现在在4这个位置,那么插入一个元素rear就到了0,所以要取余 return true;} /*出队*/bool DeQueue(SqQueue &Q){ if(Q.rear == Q.front) return false; Q.front = (Q.front + 1) % MAXQSIZE;//同入队要取余 return true; } /*取队头元素*/bool getFront(SqQueue &Q, int &e){ if(Q.rear == Q.front) return false; e = Q.base[Q.front]; return true;}int main(){ SqQueue Q; InitQueue(Q); while(1) { printf("1.入队 2.出队 3.取队头元素 4.退出 :"); int choose; scanf("%d", &choose); if(choose == 4) break; switch(choose) { case 1://入队 int e; printf("输入入队元素:"); scanf("%d", &e); if(!EnQueue(Q, e)) printf("栈已满,入队失败!!\n"); printf("\n"); break; case 2://出队 if(!DeQueue(Q)) printf("队列为空,出队失败!!\n"); printf("\n"); break; case 3://取队头元素 if(!getFront(Q, e)) printf("队列为空,取队头元素失败!!\n"); else printf("队头元素为 %d\n", e); printf("\n"); break; } } return 0; }
阅读全文
0 0
- 队列----循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- select函数
- [Unity 设计模式]桥接模式(BridgePattern)
- 嵌入式Linux中的根文件系统详解
- 设计模式
- 深入C++的运算符重载
- 循环队列的实现
- R-FCN+ResNet-50用自己的数据集训练模型(python版本)
- HIVE中insert into 和overwrite的用法--转载
- C笔记 符号数
- 从程序员角度看ELF
- C语言的单链表面试题----进阶
- NLTK学习笔记(五):分类和标注词汇
- 异常处理
- bzoj1802: [Ahoi2009]checker