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; }