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.