循环队列
循环队列是队列的一种顺序表示与实现方法。

每次入队会使rear往后走一位,出队会使front走一位。
入队

出队

我们可以看到rear指针总指向队里最后一个的下一个位置
此时当rear == front时,如果之前有元素出队,那么就会造成“队满”的假象。
此时使用取模运算可以解决这个问题。
因此队尾指针变化为
rear = (rear + 1) % MAXSIZE;
队首指针变化为
front = (front + 1) % MAXSIZE;
但是如果仅使用rear == front来判断队满还是队空,会发生歧义
队空

队满

解决方案是牺牲一个元素的空间,当队尾指针的下一个元素为队首元素时,则队满,停止入队
队满

判空条件为
rear == front;
判满条件为
(rear + 1) % MAXSIZE == front;
实现
#include <iostream>
#define ElementType int
#define MAXSIZE 50
class CircularQueue
{
ElementType element[MAXSIZE];
int rear;
int front;
public:
void init();
bool enterQueue(ElementType x);
bool deleteQueue(ElementType* x);
};
void CircularQueue::init()
{
this->front = this->rear = 0;
}
bool CircularQueue::enterQueue(ElementType x)
{
if ((this->rear + 1) % MAXSIZE == this->front)
{//栈满
return false;
}
this->element[this->rear] = x;
this->rear = (this->rear + 1) % MAXSIZE;
return true;
}
bool CircularQueue::deleteQueue(ElementType* x)
{
if (this->front == this->rear)
{//空队
return false;
}
*x = this->element[this->front];
this->front = (this->front + 1) % MAXSIZE;
return true;
}
int main(){
CircularQueue Queue;
Queue.init();
int x;
Queue.deleteQueue(&x);
Queue.enterQueue(1);
Queue.enterQueue(2);
Queue.enterQueue(3);
Queue.enterQueue(4);
Queue.enterQueue(5);
}

浙公网安备 33010602011771号