赞
踩
循环队列就是将队列存储空间的最后一个位置绕到第一个位置,首尾相连形成逻辑上的环状空间,供队列循环使用。
循环队列可以更简单防止假溢出的发生,但队列大小是固定的。
作为队列用的存储区还没有满,但队列却发生了溢出,我们把这种现象称为"假溢出"
解决假溢出有两种方案:
一、将队列元素向前搬移。
二、将队列看成首尾相连,即循环队列。
循环队列中,由于入队时尾指针向前追赶头指针;
出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。
因此,无法通过条件“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时为队满。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。