如何判断循环队列为队空or队满?

什么是循环队列

循环队列就是将队列存储空间的最后一个位置绕到第一个位置,首尾相连形成逻辑上的环状空间,供队列循环使用。

循环队列可以更简单防止假溢出的发生,但队列大小是固定的。

假溢出

作为队列用的存储区还没有满,但队列却发生了溢出,我们把这种现象称为"假溢出"

解决假溢出有两种方案:

一、将队列元素向前搬移。

二、将队列看成首尾相连,即循环队列。

 

如何判断循环队列为队空or队满?

循环队列中,由于入队时尾指针向前追赶头指针;

出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。

因此,无法通过条件“front==rear”来判别队列是"空"还是"满"。

 

第一种情况——“牺牲”一个单元

 

约定循环队列少用一个空间,此时队列为空的判断条件仍然是 ront==rear,

认为出现上图的情况即为队满,此时rear+1=front。

在一般情况下,当队列满时,rear+1=front。

但是,有个特殊情况,就是rear=n-1,而front=0时,这时候,rear+1=n,并不等于front。而此时front=0。

由于rear,front均为所用空间的指针,循环只是逻辑上的循环,为了规避这一特殊情况,需要余运算。

真正的队满表达式为:(rear+1)%n==front。

rear+1最大的情况就是 n ,不会大于 n。特殊情况就是(rear+1)%n == n%n ==front== 0。

除rear+1=n的 最大情况,剩余情况怎么余 n 都是 tail+1 本身,也就是 front。

第二种情况——不“牺牲”

设标记法

设标记tag

当有数据出队时,tag=-1;

当有数据入队时,tag=1;

利用这个方法,当rear==front时,若tag=-1,说明是由出队导致的,此时为队空

                         当rear==front时,若tag=1,说明是由入队导致的,此时为队满

计数法

定义一个变量count,来计算在队列中的数据个数。

当有数据入队时,++count

当有数据出队时,--count

当count==0时为队空,当count==MaxSize时为队满。

  • 28
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值