循环队列入队与出队

1. 队空

牺牲一个存储单元的方案中,队空条件是 front == rear

0
1
2
3
4
5
F/R
queue->front = 0;
queue->rear = 0;

2. 入队写 rear

先把新元素写到 rear 所指位置,再让 rear 循环后移。

a
1
2
3
4
5
frontrear
queue->data[queue->rear] = value;
queue->rear = (queue->rear + 1) % MaxSize;

3. 出队读 front

出队只能删除队头元素。先读 front 所指位置,再让 front 循环后移。

0
b
c
3
4
5
frontrear
*value = queue->data[queue->front];
queue->front = (queue->front + 1) % MaxSize;

4. 队满

rear 的下一个位置就是 front,再入队会无法区分队满和队空。

a
b
c
d
4
e
rearemptyfront
if ((queue->rear + 1) % MaxSize == queue->front) {
    return false;
}