栈的指针实现

在算法中要用到多个栈时,最好用链表作为栈的存储结构,即用指针来实现栈。用这种方式实现的栈也称为链栈,见图4。由于栈的插人和删除操作只在表头进行,因此用指针实现栈时没有必要像单链表那样设置一个表头单元。

图4 链栈

栈的类型说明与单链表类似。

type

 TNode=record

    element:TElement;

        next:^TNpde;

       ent;

 TStack=^TNode

链栈的基本操作实现如下:

procedure MakeNull(Var S:TStack);

var p:TStack;

begin

 p:=S;

 while S<>nil do

  begin

   S:=S^.next;

   dispose(p); {释放该单元占用的内存空间}

   p:=S;

  end;

end;

function Empty(var S:Stack):Boolean;

begin

 return(S=nil);

end;

finction Top(var S:TStack):TElement;

begin

 if Empty(S) then Error('The stack is empty.')

             else return(S.element);

end;

procedure Pop(var S:TStack);

var p:TStack;

begin

 if Empty(S) then Error('The stack is empty.')

             else begin

                   p:=S;

                   S:=S^.next;

                   dispose(p);

                  end;

end;

procedure Push(x:TElement;var S:TStack);

var p:TStack;

begin

 new(p);

 p^.element:=x;

 p^.next:=S;

 S:=p;

end;

显然,以上操作中只用MakeNull的复杂性为O(n),其余的复杂性为O(1)。

<script src="../../../lib/footer.js" type="text/javascript"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值