C++实现环形队列

实现环形队列

线性队列原理图:

假设是长度为5的数组,初始状态,空队列如所示,front与 rear指针均指向下标为0的位置。然后入队a1a2a3a4, front指针依然指向下标为0位置,而rear指针指向下标为4的位置。

在这里插入图片描述

出队a1a2,则front指针指向下标为2的位置,rear不变,如下图所示,再入队a5,此时front指针不变,rear指针移动到数组之外 ,造成假溢出的现象:

在这里插入图片描述

为了解决这个问题,引入了循环队列的概念。

循环队列原理图:

在这里插入图片描述

可以看到当循环队列属于上图的d1情况时,是无法判断当前状态是队空还是队满。为了达到判断队列状态的目的,可以通过牺牲一个存储空间来实现。如上图d2所示:

  • 队头指针在队尾指针的下一位置时,队满。 Q.front == (Q.rear + 1) % MAXSIZE 因为队头指针可能又重新从0位置开始,而此时队尾指针是MAXSIZE - 1,所以需要求余。
  • 当队头和队尾指针在同一位置时,队空。 Q.front == Q.rear

还有一种方式是附加一个标志位tag

  • 当head赶上tail,队列空,则令tag=0;
  • 当tail赶上head,队列满,则令tag=1。

C++实现

const int maxn = 100;

template <class T>
class CircularQueue {
   
public:
    CircularQueue();
    CircularQueue(const int len);
    ~CircularQueue();

public:
    bool empty();
    bool full();
    void push(T x);
    
  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值