program stack; { CS 313 Stack example } { Daniel Scharstein } type intlist = ^elt; elt = record val : integer; next : intlist; end; var mystack: intlist; { global variable } procedure push(n : integer); { push n on stack } var e : intlist; begin new(e); { allocates new memory } e^.val := n; e^.next := mystack; mystack := e; end; { push } function empty: boolean; { return whether is stack empty } begin empty := mystack = nil; end; { empty } function pop: integer; { pop a value off stack and return it } var e : intlist; begin if empty then pop := 0 else begin e := mystack; mystack := mystack^.next; pop := e^.val; dispose(e); { frees memory that was used to hold first elt } end; end; { pop } procedure printstack; { print current contents of stack } var e : intlist; begin write('Stack: '); e := mystack; while (e <> nil) do begin write(e^.val, ' '); e := e^.next; end; writeln; end; { printstack } { main program: } var i: integer; { local variable for main } begin mystack := nil; for i:=1 to 5 do begin writeln('Push ', i); push(i); end; writeln('Pop ', pop); printstack; writeln('Pop ', pop); writeln('Push 6'); push(6); while not empty do writeln('Pop ', pop); end.