循环队列

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

 每次入队会使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);
}
posted @ 2022-03-16 14:35  帝皇の惊  阅读(401)  评论(0)    收藏  举报