关于环型队列长度的计算
一 说明队列长度计算公式
-
假设数据只进入队列,而不出队列,即front=0,在原处,而rear在不断增加。此时显然,循环队列的元素个数为rear-front=rear-0 =rear, 如下图
-
假设数据进入队列,有出队列,如下图
此时要想得到队列长度,参考上面思想,我们可以把队列顺时针移动,使其front回归到front=0,此时rear的值就是队列长度。
那么队列移动多少次呢?先给答案:MaxSize-front次。
即,下图这么多次:
rear的位置响应的移动了MaxSize次,移动后rear的位置为:rear=(rear+MaxSize-front)%MaxSize。这也是队列的长度。
二 为什么是顺时针移动而不是逆时针移动呢?
- 场景1:rear>front,即
假设:MaxSize=10,front=1,rear=4,
(1)逆时针旋转的话就是(4-1)%10=3
(2)顺时针的话就是(4+10-1)%10=3
此时是没有问题的。 - 场景2:rear<front,即
假设:MaxSize=10,front=maxSize-1=9,rear=2,
(1)逆时针就是(2-9)%10=-7
(2)顺时针就是(2+10-9)%10=3
此时逆时针计算的就是不正确的。 - 原因分析
在队列中,顺时针是加法,而逆时针是减法,在循环队列中,rear和front都通过取模运算,限制在了[0,MaxSize-1]范围内,当rear<front是,此时做减法会导致结果小于0,而出现结果的错误。