队列的遗留问题

问题:在循环队列中,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的利用)

发布了28 篇原创文章 · 获赞 13 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/pilgrim_121/article/details/88550400
今日推荐