循环队列介绍
这里介绍的时队列的顺序存储结构(队首指针指向队头元素,队尾指针指向队尾元素的下一个位置):
- 初始时: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。
显然,队空的条件是:Q.front = Q.rear。但是,如果入队的速度快于出队的速度,队尾指针很快就赶上队首指针,此时,也有:Q.front = Q.rear。为了区分队空还是队满,有多种方式可以处理,这里介绍一种较为普遍的做法,即牺牲一个单元来区分队空和队满,入队时少用一个队列单元。约定:队尾指针在队首指针的上一个位置时,作为队满标志(这里也可以说:队首指针在队尾指针的下一位置时,作为队满的标志)
约定的原因
队空和队满时,都有Q.front = Q.rear,但两者发生的过程时不同的:
- 队空,是因为通过多次出队的操作,那么队首指针必然是通过顺时针 旋转,最后达到队尾指针,也就是说队首指针会先达到队尾指针减一的位置,然后再到达队尾指针的位置;
- 队满,是因为通过多次入队的操作,那么队尾指针也是通过顺时针旋 转,最后达到队首指针,也就是说,队尾指针会先到达队首指针减一的位置,然后再到达队首指针的位置。
注:以上内容参考了王道考研的数据结构。