循环队列定义
在逻辑上把顺序存储的队列想象成一个环,就是循环队列。
循环队列仍是顺序存储,只是元素可以循环存储在给定的存储空间。
前篇文章,顺序存储队列基本操作 所描述的队列的存储空间只可以使用一次,在一些元素出队之后,空出来的空间没有办法再次存储,造成浪费,所以更多选择循环队列。
两者的内存中的存储一样,只是逻辑上将两者分为了非循环和循环。
循环队列判空、判满
判空和判满可以有多种方式,根据自己的设计选择即可。
第一种方式:
判空:当首尾指针指向同一位置时,队列为空。
判满:当尾指针+1 = 首指针,队列已满。
(这种方式是牺牲一个存储空间来判断队列是否已满)
注意:判满时 需要对maxsize取余,否则rear可能超出maxsize。
第二种方式:
单独设置一个length变量,来存储队列的长度
判空:length = 0
判满:length = maxsize
前篇文章,顺序存储队列基本操作 就是利用length判断长度
第三种方式
设置一个tag参数 tag=1 时队满;tag= 0 时对空。
判空:当首尾指针指向同一位置时,队列为空。
判满:tag=1 时队满;tag= 0 时对空。
循环队列长度
length = (rear + maxsize - front)%maxsize;
代码实现
/**
* 循环队列的基本操作
*/
#include <cstdio>
#define maxsize 6 //定义队列中元素的最大个数
/**
* 定义结构
*/
typedef struct {
int data[maxsize]; //存放队列元素
int front,rear; //对头指针和队尾指针 数组下标也可以表示指针,可以不加*
}SqQueue;
/**
* 初始化队列,构造一个空的队列
*/
void initQueue(SqQueue &Q){
Q.front = Q.rear = 0; //初始化队首队尾指针,构建空的队列
}
/**
* 判断队列是否为空
*/
bool QueueIsEmpty(SqQueue Q){
if(Q.front == Q.rear){
//队列为空
printf("队列为空 \n");
return true;
}else{