队列的基本操作有二:Enqueue(入队)、Dequeue(出队)。
链表的实现(未实现),下面讨论数组实现。

一、队列的数组实现

我们需要一个数组queue、位置front和rear(后方的)用于记录哪里是队列的头和尾部,size用于记录元素的个数。
image.png
入队和出队,需要上述相应参数的相应变化。
image.png
这种操作会导致一个问题,就是说rear在到达尾部时,就无法入队,但是前端可能有出队,进而导致有部分数组空间未能用到。所以我们需要循环数组(circular array)。

1. 循环数组

只要front或者rear到达尾部时,它就绕回开头。

运行时间分析

只需要添加很少的代码,但是会导致运行时间加倍。

示例

image.png

边界条件分析

dequeue 需要检测队列是否为空,因为为空时使用dequeue会导致返回一个不确定值。

  • 当不适用size显示的记录队列大小时

可以依赖基准情况 rear=front-1来推出队列大小(也就是rear和front的差值绝对值),但是会有许多特殊的情况需要考虑,此时需要注意。
此时,若数组的大小为 ASize,则当有ASize-1个元素存在时队列就满了,因为rear和front的差值绝对值只有ASize-1种情况。【这个地方的思考方式值得学习】

2. 代码实现