使用循环队列的原因:


如图(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];//返回队头元素的值,队头指针不变 
	 } 
}