3.3.2 队列的存储表示和操作的实现

 二、循环队列

  和顺序栈相类似,在利用顺序分配存储结构实现队列时,除了用一维数组描述队列中数据元素的存储区域之外,尚需设立两个指针 front 和 rear 分别指示"队头"和"队尾"的位置。为了叙述方便,在此约定:初始化建空队列时,令 front=rear=0,每当插入一个新的队尾元素后,头指针 front 增1;每当删除一个队头元素之后,尾指针增1。因此,在非空队列中,头指针始终指向队头元素,而尾指针指向队尾元素的"下一个"位置。如下图所示。

 

  假设在这之后又有两个元素 f 和 g 相继入队列,而队列中的元素 b 和 c 又相继出队列。则队头指针指向元素 d,队尾指针则指到数组"之外"的位置上去了,致使下一个入队操作无法进行(请注意此时队列空间并未满)。为此,设想这个数组的存储空间是个"环",认定"7"的下一个位置是"0"。如下图所示。

   
 

  循环队列是队列的一种顺序存储表示。那么为什么要称作"循环队列"而不说是"顺序队列"呢?

  这是由于队列操作(在队尾插入元素,而在队头删除元素)的特殊性造成的。这好比我们在食堂排队买饭,因为柜台是固定位置不动的,则每次排头的人买完离开队伍之后,后面的人依次往前"移动"一个位置,为了避免"移动"可以改一种方式。让吃饭的人围着圆桌"依次"入座,而食堂的师傅推着小车围着圆桌按先后落座的次序"依次"卖饭,并假定"先来的先走" 。则就是"循环队列"的一种模拟。动画