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

什么是循环队列

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

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

假溢出

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

解决假溢出有两种方案:

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

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

 

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

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

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

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

 

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

 

如何判断循环队列为队空or队满?_第1张图片

约定循环队列少用一个空间,此时队列为空的判断条件仍然是 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时为队满。

你可能感兴趣的:(数据结构与算法)