3.3.1 队列的类型定义

  
队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。在表中,允许插入的一端称作"队列尾(tail)",允许删除的另一端称作"队列头(front)"。
 

 其类型定义如下:

ADT
Queue {
 数据对象:D={ | ∈ElemSet, i=1,2,...,n, n≥0}

 
数据关系:R1={ < , > | , ∈D, i=2,...,n}
       约定其中 端为队列头, 端为队列尾。
 
   
  在日常生活中经常会遇到为了维护社会正常秩序而需要排队的情境,在计算机程序设计中也经常出现类似问题。数据结构"队列"与生活中的"排队"极为相似,也是按"先到先办"的原则行事的,并且严格限定:既不允许"加塞儿",也不允许"中途离队"。

  如图所示,队列中的数据元素以 ,,…, 的次序依次进队列,则也只能依相同次序退出队列。即 是第一个出队列的元素,只有在 ,,…, 都离开队列之后, 才能出队列。队列的修改是依"先进先出"的原则进行的,因此队列又称FIFO(First In First Out 的缩写)表。
 
   基本操作:
  InitQueue(&Q)
   操作结果:构造一个空队列 Q。

  DestroyQueue(&Q)
   初始条件:队列 Q 已存在。
   操作结果:队列 Q 被销毁,不再存在。

  ClearQueue(&Q)
   初始条件:队列 Q 已存在。
   操作结果:将 Q 清为空队列。

  QueueEmpty(Q)
   初始条件:队列 Q 已存在。
   操作结果:若 Q 为空队列,则返回TRUE,否则返回FALSE。

  QueueLength(Q)
   初始条件:队列 Q 已存在。
   操作结果:返回 Q 的元素个数,即队列的长度。
 
 
  队列类型中的九个基本操作恰好和栈的九个操作是一一对应的。同样要求熟练掌握。
 
    GetHead(Q,&e)
   初始条件:Q 为非空队列。
   操作结果:用 e 返回Q的队头元素。

  EnQueue(&Q,e)
   初始条件:队列 Q 已存在。
   操作结果:插入元素 e 为 Q 的新的队尾元素。

  DeQueue(&Q,&e)
   初始条件:Q 为非空队列。
   操作结果:删除 Q 的队头元素,并用 e 返回其值。

  QueueTraverse(Q,visit( ))
   初始条件:队列 Q 已存在且非空,visit( )为元素的访问函数。
   操作结果:依次对 Q 的每个元素调用函数 visit( ),
        一旦 visit( ) 失败则操作失败。

} ADT Queue
 
  这是取队头元素操作,用e返回队列中当前的队头元素,但不将它从队列中删除。
 
 
  这是入队列操作:在当前的队尾元素之后插入新的队尾元素。
 
  这是出队列操作,用e返回当前的队头元素,并将它从队列中删除。
 
  这是对队列进行从队头到队尾的"遍历"操作,应用较多的场合是,输出队列中所有数据元素。