用指针实现队列
2006-05-04 16:20
232 查看
与栈的情形相同,任何一种实现表的方法都可以用于实现队列。用指针实现队列得到的实际上是一个单链表。由于入队在队尾进行,所以用一个指针来指示队尾可以使入队操作不必从头到尾检查整个表,从而提高运算的效率。另外,指向队头的指针对于Front和Dequeue运算也是必要的。为了便于表示空队列,我们仍使用一个表头单元,将队头指针指向表头单元。当队头和队尾指针都指向表头单元时,表示队列为一个空队列。
用指针实现队列时,单元类型及队列类型可说明如下:
其中front为队头指针,rear为队尾指针。图8是用指针表示队列的示意图。
![](http://algorithm.diy.myrice.com/datastructure/basic/queue/images/img1.gif)
图8 用指针实现队列
下面我们来讨论队列的5种基本运算。
用指针实现队列时,单元类型及队列类型可说明如下:
type TPosition=^NodeType; NodeType=record Element:ElementType; next:TPosition; end; QueueType=record front,rear:TPosition; end; |
![](http://algorithm.diy.myrice.com/datastructure/basic/queue/images/img1.gif)
图8 用指针实现队列
下面我们来讨论队列的5种基本运算。
函数 Front(Q) 功能 这是一个函数,函数值返回队列Q的队头元素。用一般的表运算可将Front(Q)表示为Retrieve(First(Q),Q)。 实现 Function Front(var Q:QueueType):ElementType; begin if Empty(Q) then error('The queue is empty!') else return(Q.front^.next^.Element); end; 说明 显然。 复杂性 显然为O(1)。 |
函数 Enqueue(x,Q) 功能 将元素x插入队列Q的队尾。此运算也常简称为将元素x入队。也可用一般的表运算将Enqueue(x,Q)表示为Insert(x,End(Q),Q)。 实现 Procedure Enqueue(x:ElementType;var Q:QueueType); begin new(Q.rear^.next); Q.rear:=Q.rear^.next; Q.rear^.Element:=x; Q.rear^.next:=nil; end; 说明 图9是该操作修改指针的示意图。 ![]() 图9 入队操作 复杂性 显然为O(1)。 |
函数 Dequeue(Q) 功能 将Q的队头元素删除,简称为出队。用一般的表运算可将Dequeue(Q)表示为Delete(First(Q),Q)。 实现 Procedure Dequeue(var Q:QueueType); var p:TPosition; begin if Empty(Q) then Error('The queue is empty!') else begin p:=Q.front; Q.front:=Q.front^.next; dispose(p); end; end; 说明 图10是该操作修改指针的示意图。 ![]() 图10 出队操作 复杂性 显然为O(1)。 |
函数 Empty(Q) 功能 这是一个函数,若Q是一个空队列,则函数值为true,否则为false。 实现 Function Empty(var Q:QueueType):Boolean; begin return(Q.front=Q.rear); end; 说明 当Q.front与Q.rear指向同一个结点单元时队列为空。 复杂性 显然为O(1)。 |
函数 MakeNull(Q) 功能 使队列Q成为空队列。 实现 Procedure MakeNull(var Q:QueueType); begin Q.rear:=Q.front; while Q.front<>nil do begin Q.front:=Q.front^.next; dispose(Q.rear); Q.rear:=Q.front; end; new(Q.front); Q.front^.next:=nil; Q.rear:=Q.front; end; 说明 首先将Q中所有的结点内存释放,然后重新生成一个结点作为标头单元,并使Q.rear:=Q.front。 复杂性 若输入的队列Q中有n个结点,则复杂性为O(n)。 |
相关文章推荐
- c++通过指针实现队列
- 队列,数组实现,指针实现的源码详细讲解
- C_栈和队列(ADT)-队列的非循环(无头指针)顺序表示和实现
- 一步一步学数据结构之1--1(队列--单链表实现--含队头尾指针)
- C_栈和队列(ADT)-队列的非循环(带头指针)顺序表示和实现
- C语言指针实现简单队列
- 数组实现的队列(限制最大长度)的head、tail指针的修改方法。
- 队列的指针实现
- 数据结构(队列--单链表表实现--不含队头尾指针)
- 多态&指针访问虚函数&不能被继承的类&快速排序&N皇后问题&插入排序&堆排序&merge归并排序&栈上生成对象&两个栈实现一个队列
- 用指针实现队列的方法
- 一步一步学数据结构之1--1(队列--单链表实现--含队头尾指针)
- 第7周项目实践2.1 用只有尾节点指针rear的循环单链表实现队列算法库
- 一步一步学数据结构之1--1(队列--单链表表实现--不含队头尾指针)
- 另类循环队列---未实现题目要求,实现了双指针(Front、Rear)
- C++学习笔记(四)指针实现的链表、堆栈、队列、二叉查找树
- 用指针实现队列
- 不用指针链表实现先入先出队列
- "《算法导论》之‘队列’":队列的三种实现(静态数组、动态数组及指针)
- 两个栈实现队列