为了能充分的利用空间,解决顺序队列的“假溢出”问题,可以采用两种方法:一种是将数据向前移动,让空的存储单元留在队尾;另一种是将顺序队列构造成一个环状的空间,即将队列的数据区data[0....MAXSIZE-1]看成头尾相接的循环结构,使得data[0]接在data[MAXSIZE-1]之后,这就是循环队列。
这节就来实现循环顺序队列。
循环队列中的空闲的空间可以被利用,除非数组空间真的被队列元素全部占用,否则不会上溢。因此,队一此简单的应用外,真正实用的顺序队列是循环队列。
入队时,队尾指针向前追赶队头指针;出队时,队头指针向前追赶队尾指针。因此队空和队满指针均等于队尾指针,无法通过Q->front == Q->rear来判断顺序队列是空还是满。
为了解决这个问题,有3种方法,其一是设一个标识位,以区别顺序队列是空还是满;其二是使用一个计数器记录队列中元素的总数;其三是少用一个元素空间,约定入队前测试队尾指针在循环意义下加1是否等于队头指针,若相等,则认为是队满(注:rear所指的单元始终为空)。
这节,就先采用第二种方法,设一个计数器记录队列中元素的总数,用于判断队列空还是队列满。
顺序队列(循环队列)类型描述:
//顺序队列的类型描述(设立计数器)
#define MAXSIZE 100
typedef int ElemType;
typedef struct{
ElemType