{ prima di includere questo file si deve dichiarare:
  (i)  la lunghezza massima della pila;
  (ii) il tipo degli elementi da inserire nella pila.
  Questo viene realizzato mediante le seguenti dichiarazioni:

const
  MaxPila = ...;

type
  TipoElemPila = ...; 
}

{ dichiarazioni di tipo }

type
  TipoPosPila = 0..MaxPila;
  TipoPila = record
               pila : array[1..MaxPila] of TipoElemPila;
               pos  : TipoPosPila;
             end;   


{ implementazione delle operazioni primitive sulle pile }

procedure InitPila (var p: TipoPila);
{ inizializza la pila p ponendo a 0 il puntatore all'elemento
  affiorante della pila }
begin
  p.pos := 0
end; { InitPila }


function TestPilaVuota (p: TipoPila): boolean;
{ restituisce TRUE se la pila p e' vuota, FALSE altrimenti }
begin
  TestPilaVuota := (p.pos = 0)
end; { TestPilaVuota }


procedure TopPila (p: TipoPila; var v: TipoElemPila);
{ restituisce in v l'elemento affiorante della pila p,
  senza modificare la pila }
begin
  if TestPilaVuota(p) then
    writeln('ERRORE: PILA VUOTA')
  else
    v := p.pila[p.pos]
end; { TopPila }


function TestPilaPiena (p: TipoPila): boolean;
{ restituisce TRUE se la pila p e' piena, FALSE altrimenti }
begin
  TestPilaPiena := (p.pos = MaxPila)
end; { TestPilaPiena }


procedure Push (var p: TipoPila; v: TipoElemPila);
{ inserisce l'elemento v in cima alla pila p }
begin
  if TestPilaPiena(p) then
    writeln('ERRORE: PILA PIENA')
  else
  begin
    p.pos := p.pos + 1;
    p.pila[p.pos] := v
  end
end; { Push }


procedure Pop (var p: TipoPila; var v: TipoElemPila);
{ elimina l'elemento affiorante della pila p, restituendone 
  il valore in v }
begin
  if TestPilaVuota(p) then
    writeln('ERRORE: PILA VUOTA')
  else
  begin
    v := p.pila[p.pos];
    p.pos := p.pos - 1
  end
end; { Pop }