一.引入
假设线性表有 n 个数据元素,顺序表要求把表中的所有元素都存储在数组的前 n 个单元。假设队列有 n 个数据元素,顺序存储的队列也应该把队列的所有元素都存储在数组的前 n 个单元。如果把队头元素放在数组中下标为 0 的一端,则入队操作的时间开销仅为 O(1) ,此时的入队操作相当于追加,不需要移动元素;但是出队操作的时间开销为 O(n) ,因为要保证剩下的 n-1 个元素仍然存储在数组的前 n-1 个单元,所有元素都要向前移动一个位置。
如果放宽队列的所有元素必须存储在数组的前 n 个单元这一条件,只要求队列的元素存储在数组中连续的位置,就可以得到一种更为有效的存储方法,此时入队和出队操作的时间开销都是 O(1) ,因为没有移动任何元素,但是队列的队头和队尾都是活动的,因此,需要设置队头、队尾两个指针,并且约定:队头指针 front 指向队头元素的前一个位置,队尾指针 rear 指向队尾元素。
但是这种方法有一个新的问题。随着队列的插入和删除操作的进行,整个队列向数组中下标较大的位置移过去,从而产生了队列的 “单向移动性” 。当元素被插入到数组中下标最大的位置上之后,队列的空间就用尽了,尽管此时数组的低端还有空闲空间,这种现象叫做 “假溢出” 。
解决假溢出的方法是将存储队列的数组看成是头尾相接的循环结构,即允许队列直接从数组中下标最大的位置延续到下标最大的位置延续到下标最小的位置。这通过取模操作很容易实现。队列的这种头尾相接的顺序存储结构成为循环队列。
二.算法设计</