循环队列入队与出队
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;
}