使用循环队列的原因:
如图(d),假设当前队列分配空间最大为6,元素123456相继入队后,元素1234按顺序出队,此时不能再继续插入新的队尾元素,否则会出现数组越界而导致的程序非法操作错误,但实际上此时队列的实际空间并未占满,所以称为假溢出。
解决这一问题的方法是循环队列:
队空的条件:
Q.front==Q.rear;
队列满的条件:
(Q.rear+1)%MAXQSIZE==Q.front;
(1)循环队列的初始化: Status InitQueue(SqQueue &Q)
{
Q.base=new QElemType[MAXQSIZE]; //为队列分配一个最大容量为MAXSIZE的数组空间
if(!Q.base)
{
return false;
}
Q.front=Q.rear=0; //头指针和尾指针置为0,队列为空
return true;
}
(2)求循环队列的长度: int QueueLength(SqQueue Q)
{
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
(3)入队: Status EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+1)%MAXQSIZE==Q.front)
{//尾指针在循环意义上加1后,等于头指针,表明队满
return false;
}
Q.base[Q.rear]=e;//新元素插入队尾
Q.rear=(Q.rear+1)%MAXQSIZE; //队尾指针加一
return true;
}
(4)出队: Status DeQueue(SqQueue &Q,QElemType &e)
{
if(Q.front==Q.rear)
{//队空
return false;
}
e=Q.base[Q.front];//保存队头元素
Q.front=(Q.front+1)%MAXQSIZE;//队头指针加1
return true;
}
(5)取循环队列的队头元素: SElemType GetHead(SqQueue Q)
{
if(Q.front!=Q.rear)//队列非空
{
return Q.base[Q.front];//返回队头元素的值,队头指针不变
}
}