Unit stack; INTERFACE Type TTree = ^element; element = record left, right : TTree; data : integer; end; TElem = integer; LIFO = ^Node; Node = record info : TTree; Next : LIFO; end; Procedure Init(var s:LIFO); Function isEmpty(S:LIFO):Boolean; Procedure Push(var S:LIFO; E:TTree); Function Pop(var S : LIFO):TTree; Procedure free(var s:LIFO); IMPLEMENTATION Procedure Init(var s:LIFO); begin s:=nil end; Function isEmpty(S:LIFO):Boolean; begin isEmpty:=(S=NIL); end; Procedure Push(var S:LIFO; E:TTree); var z : LIFO; begin new(z); z^.next:=s; Z^.INFO:=E; s:=z; end; Function Pop(var S:LIFO):TTree; const errorcode = 255; var z : LIFO; begin If isEmpty(S) then begin writeln('Error'); Halt(errorcode); end else begin z:=s; s:=s^.next; Pop:=z^.info; dispose(z) end end; { Pop } procedure free(var S : LIFO); begin while S<>nil do pop(s); end; end.