存在问题
设数组长度为M,则:
当front=0,rear=M时,再有元素入队发生溢出——真溢出
当front0,rear=M时,再有元素入队发生溢出——假溢出
解决方案
队首固定,每次出队剩余元素向下移动——浪费时间
循环队列
基本思想:把队列设想成环形,让sq[0]接在sq[M-1]之后,若rear+1==M,则令rear=0;
实现:利用“模”运算
入队: rear=(rear+1)%M; sq[rear]=x;
出队: front=(front+1)%M; x=sq[front];
队满、队空判定条件
//向循环队列插入元素
status enqueue(sqqueue &q,const int&e)//队列插入元素
{
if( (q.rear+1)%MAXSIZE==q.front ) return ERROR;//队满返回添加元素错误
q.base[q.rear]=e;//添加元素
q.rear=(q.rear+1)%MAXSIZE;//修改队尾指针指到添加的元素的下一个位置
return OK;//添加成功
}
//向循环队列删除元素
status enqueue(sqqueue &q, int&e)//从队头删除元素,把队头元素给e,可以输出e或者其他运算
{
if( q.rear==q.front ) return ERROR;//对空删除失败
e=q.base[q.front];//把队头元素给e
q.front=(q.front+1)%MAXSIZE;//修改队头指针位置
return OK;//返回删除成功
}