循环队列(Circular Queue)

本文深入讲解了循环队列的概念,对比普通队列,解决了“假溢出”问题,介绍了循环队列的入队和出队操作,以及如何判断队列的满与空状态。提供了两种方法来区分队满和队空,一种是使用计数变量,另一种是牺牲一个元素空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可以看下这个博主写得非常详细:wowocpp

        循环队列是 队列的一种特殊形式。首先介绍队列,然后引申出循环队列。
        队列又称为“先进先出”(FIFO)线性表 :限定插入操作只能在队尾进行,而删除操作只能在队首进行
        队列也可以采用顺序存储结构或链表结构来实现,分别称为顺序队列和链队列


队列的顺序表示—顺序队列

        用一组连续的存储单元依次存放从队首到队尾的元素,附设两个指针head和tail分别指向队首元素和队尾元素的位置,
(有的地方用front 和 rear 表示)
在这里插入图片描述
        当head = tail = 0时表示空队列

这里写图片描述

        当插入新元素到队尾时,tail加1

这里写图片描述

        当删除队首元素时,head加1,上图如果把C也删掉,那么就 head = tail 了

        tail 始终指向队列元素的下一个位置

对应的操作:

  • 队空:head=tail
  • 求队长:tail - head
  • 入队:新元素按 tail 指示位置加入,再将队尾指针加1 ,即 tail = tail + 1
  • 出队:将head指示的元素取出,再将队头指针加1,即head = head + 1

这里写图片描述
        在顺序队列中,当队尾指针已经到数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫做 “假溢出”


        解决假溢出的途径----采用循环队列,下面引入循环队列
这里写图片描述
在这里插入图片描述
        入队,tail指针变化: tail= (tail+1)%maxsize

在这里插入图片描述
        出队,head指针变化: head=( head +1)%maxsize

删除数据C,队列为空
这里写图片描述
        依次插入数据D,E,F,G,H,I,J,K
        队列满 :head = tail
这里写图片描述
        队满和队空时,均有head=tail 。因此,只凭head=tail 还无法区分是满还是空。

        如何判定队列满还是空?

  • 方法1:
    用一个计数变量来记载队列中的元素个数
    初始化队列时c=0;
    当入队时,计数变量+1( c=c+1 )
    当出队时,计数变量-1 (c=c-1)
    当计数变量=maxsize时,队满
    当计数变量=0时,队空
  • 方法2:
    牺牲一个元素空间,来区别队空或队满。
    入队前,先判Q.rear+1是否等于Q.front,
    若是则为队满。
    而当Q.front=Q.rear时,为队空。
    上图中:当数据J入队后,就认为队已满,
    而当数据K再要入队时,就拒绝入队。

        当队列已经满了,如果允许覆盖之前的数据
这里写图片描述
        队列已经满了之后, 继续插入数据L,M,N, 之前的数据D,E,F被覆盖 此时,队列已经满了, 最新的数据是:G,H,I,J,K,L,M,N

        在程序中,取队列的数据的时候,如果检测到队列满了, 此时,需要一次性取出队列中的数据,一次性取出数据的时候,不用管head指针,直接按照tail指针指向的位置开始取数据,直到循环取到tail-1位置停止。最终取出的数据的个数是 队列的长度 maxsize 取出之后,可以对队列指针 head 和tail初始化为 0,需要将队列满整个标志设置为False。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值