问题:在循环队列中,front指针指向队头元素,rear指向队尾元素的下一个位置。所以队列满的条件:(rear+1)%Maxsize==front,则此时队列中剩下一个位置为空。实际情况是:给队列分配了n个空间,队列仅能使用n-1个空间。如何不浪费这一个存储空间呢?
方法一:增设表示元素个数的数据成员。
队空条件:Q.size=0;
队满条件:Q.size=Q.MaxSize;
无论队满还是队空,此时Q.front=Q.rear
方法二:增设tag标志域数据成员。
具体实现:
①定义:
typedef struct{
Elemtype data[MaxSize];
int front,rear;
int tag; //tag=0表示入队,tag=1表示出队
}SqQueue;
②初始化
void InitQueue(&Q){
Q.front=Q.rear=0;
Q.tag=1; //注意:初始化时,队列为空,所以必须将tag置1
}
③入队
bool EnQueue(Queue &Q,Elemtype x){
//判断队满
if(Q.front==Q.rear&&Q.tag==0)
return false;
else
{ //入队操作
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize;
Q.tag==0; //可能导致队满
return true;
}
}
④出队
bool DeQueue(Queue &Q,Elemtype &x){
//判断队空
if(Q.front==Q.rear&&Q.tag==1)
return false;
else
{ //出队操作
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
Q.tag==1; //可能导致队空
return true;
}
}
其它:
关于队列的应用主要有:
1.树的层次遍历(后面具体会讲)
2.队列在计算机系统中的应用:
(1)主机与外设之间速度不匹配时,设置的缓冲区中所存储的数据就是一个队列
(2)解决多用户引起的资源竞争问题(CPU的利用)