队列的相关知识

1.1 队列的基本概念

       队列也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。队头:允许删除的一端。队尾:允许插入的一端。

      队列的操作特性:先进先出

1.2 队列的顺序存储结构

       1. 队列的顺序存储

          初始状态(队空条件):Q.front == Q.rear == 0

          进队操作:队不满时,先送值到队尾元素,再将队尾指针加1

          出队操作:队不空时,先取对头元素值,再将队头指针加1

       2. 循环队列

           初始状态:Q.front = Q.rear = 0

           队首指针进1:Q.front = (Q.front + 1) % MaxSize

           队尾指针进1:Q.rear = (Q.rear + 1) % MaxSize

           队列长度:(Q.rear + MaxSize - Q.front) % MaxSize

           出队入队时:指针都按顺时针方向进1

1.3 判断队空还是队满的三种处理方式

(1)牺牲一个单元来区分队空和队满,入队时少用一个队列单元,约定以“队头指针在队尾指针的下一位置作为队满的标志”

        队满条件:(Q.rear + 1) % MaxSize == Q.front

        队空条件:Q.front = Q.rear

        队列中元素个数:(Q.rear - Q.front + MaxSize) % MaxSize

(2)类型中增设表示元素个数的数据成员Size,这样,队空的条件为Q.Size = 0,队满条件:Q.Size == MaxSize。这两种情况都有Q.front == Q.rear

(3)类型中增设tag数据成员,以区分是队空还是队满。tag = 0时,若因删除导致Q.front == Q.rear,则为队空;tag=1时,若因插入导致Q.front == Q.rear,则为队满。

1.4循环队列的操作

// 1.初始化

void InitQueue(SqQueue &Q){
     Q.rear = Q.front = 0;    }


// 2.判队空
bool isEmpty(SqQueue Q){
     if (Q.rear == Q.front)
         return true;
     else
         return false;     }


// 3.入队
bool EnQueue(SqQueue &Q,ElemType x){
     if ((Q.rear + 1) % MaxSize == Q.front)
         return false;          //队满则报错
      Q.data[Q.rear] = x;
      Q.rear = (Q.rear + 1) % MaxSize;     //队尾指针加一取模
      return true;        }


// 4.出队
bool DeQueue(SqQueue &Q,ElemType &x){
     if (Q.rear == Q.front)
         return false;
      x = Q.data[Q.front];
      Q.front = (Q.front + 1) % MaxSize;        //队头指针加一取模
      return false;       }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值