第一种方法是设置一个标志量flag,当front==rear且flag=0时为空,当front==rear且flag=1时队列为满;
第二种方法是我们修改条件,保留一个元素空间,也就是说,数组中还有一个空闲单元时,我们就认为这个队列已经满了。
接下来我们重点讨论第二种方法,由于rear可能比front大,也可能是比front小,所以尽管他们只相差一个位置时候就是满的情况,但是也可能说是相差整整一圈。所以若队列最大尺寸为QueueSize,那么队列满的条件就是(rear+1)%QueueSize==front(这里取模“%”目的就是为了整合rear与front大小为一个问题)。比如图一所示,QueueSize=5,front=0,rear=4,根据公式(4+1)%5=0,所以此时队列满。
图一
通用计算队列长度公式:
(rear-front+QueueSize)%QueueSize
/*循环队列求长度代码,返回Q元素个数*/
int QueueLength()
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
/*循环队列求长度代码,返回Q元素个数*/
int QueueLength()
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
/*循环队列的入队列操作,若队列未满则插入元素e为Q新的队尾元素*/
Status EnQueue(SqQueue *Q,QElemType e)
{
if((Q->rear+1)%MAXSIZE==Q->front)/*队列满判断*/
return ERROR;
Q-date[Q->rear]=e; /*将元素e赋值给队尾*/
Q-rear=(Q->rear+1)%MAXSIZE;
/*rear指针向后移一位置,若到最后则转到数组头部*/
return OK;
}
/*循环队列的出队列操作,若队列不空,则删除Q中队头元素,用e返回其值*/
Status DeQueue(SqQueue *Q,QElemType e)
{
if(Q->front==Q->rear) /*队列空判断*/
return ERROR;
*e=Q->data[Q->front]; /*将队头元素赋值给e*/
Q->front=(Q->front+1)%MAXSIZE;
/*front指针向后移一位置,若到最后则转到数组头部*/
return OK
}