您的位置:首页 > 其它

用指针实现队列

2006-05-04 16:20 232 查看
的情形相同,任何一种实现表的方法都可以用于实现队列。用指针实现队列得到的实际上是一个单链表。由于入队在队尾进行,所以用一个指针来指示队尾可以使入队操作不必从头到尾检查整个表,从而提高运算的效率。另外,指向队头的指针对于Front和Dequeue运算也是必要的。为了便于表示空队列,我们仍使用一个表头单元,将队头指针指向表头单元。当队头和队尾指针都指向表头单元时,表示队列为一个空队列。

用指针实现队列时,单元类型及队列类型可说明如下:

type
TPosition=^NodeType;
NodeType=record
Element:ElementType;
next:TPosition;
end;
QueueType=record
front,rear:TPosition;
end;
其中front为队头指针,rear为队尾指针。图8是用指针表示队列的示意图。



图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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: