队列的顺序存储
非循环队列
这种队列有一个问题:如下图 (c) 和 (d) 所示,数组并没有满,但是队列已满,无法再执行「入队」操作。这叫做「伪溢出」。
循环队列
循环队列是基于顺序存储来实现的,可以通过「取余运算」实现指针从尾部到首部。
循环队列有一个问题:需要用额外的信息来说明当前是满队列还是空队列。
区别空队列和满队列的一种方法:front
指向队列的头部元素;rear
指向队尾元素的下一个位置
- 判断队列为空:
rear == front
- 判断队列为满:
(rear + 1) % MaxSize == front
- 计算队列的长度:
(MaxSize + rear - front) % MaxSize
注:进行入队操作时,front
不动,rear
增加,所以可以有 rear
的数组下标大于 front
的映像。
队列的链式存储
通过单链表实现时,使用「头指针」表示「队首」,使用尾指针表示「队尾」
在链表的尾部进行入队操作,在链表的头部进行出队操作。
为了操作方便,通常会设置一个空的「头节点」
双端队列
两边都可以输入和输出
还有输入首先或者输出受限的情形
如果规定从哪端输入的元素只能由哪端输出,那么就退化为两个栈底相接的栈。