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

 二、循环队列

  循环队列的结构定义如下:
  typedef struct {
   ElemType *elem; // 存储空间基址
   int rear;    // 队尾指针
   int front;   // 队头指针
   int queuesize; // 允许的最大存储空间,以元素为单位
  } Queue;
 
  类似于顺序栈和链栈,除了循环队列的初始化需要添加一个"最大容量"的参数之外,循环队列和链队列的基本操作接口基本相同。

  以下是链队列的主要操作的函数定义。
 
     
  算法
  void InitQueue (Queue &Q,int maxsize )
 {
 // 构造一个最大存储空间为 maxsize 的空队列 Q
  if (maxsize == 0)
   maxsize = MAXLISTSIZE;
  Q.elem = new ElemType[maxsize]; // 为循环队列分配存储空间
   if (!Q.elem) exit(1);    // 存储分配失败
  Q.queuesize = maxsize;
  Q.front = Q.rear = 0;
 } // InitQueue
 
 

  对顺序存储结构,都需要预先分配一个可以使用的最大空间,和以前所讨论的顺序表和顺序栈一样,在循环队列的初始化函数中,也是由使用者来确定程序中所需要的队列最大容量。
 
  算法
  bool DeQueue (Queue &Q, ElemType &e)
 {
 // 若队列不空,则删除当前队列Q中的头元素,用 e 返回其值
 // 并返回TRUE;否则返回 FALSE

  if (Q.front == Q.rear)
   return FALSE;
  e = Q.elem[Q.front];
  Q.front = (Q.front+1) % Q.queuesize;
  return TRUE;
 }
 
  思考题 判别循环队列为"空"的条件应该是什么?在队列初始化的函数中,设置队头和队尾指针均为0,那么能否由"队头指针为0"来作为队列空的判别条件呢?