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返回当前的队头元素,并将它从队列中删除。 这是对队列进行从队头到队尾的"遍历"操作,应用较多的场合是,输出队列中所有数据元素。 |