{ File: pile.pas }

{ Scopo: rappresentazione collegata di pile }

{ Prima di includere questo file si deve dichiarare il tipo degli
  elementi da inserire nella pila, mediante una dichiarazione

type
  TipoElemPila = ...; 
}

{ dichiarazioni di tipo }

type
  TipoElemLista = TipoElemPila;  { gli elementi della lista sono dello stesso
                                   tipo degli elementi della pila }

{$I TIPOLIS.PAS} { inclusione del file contenente la definizione del tipo
                   TipoLista }

  TipoPila = TipoLista;   { una pila e` rappresentata da una lista }

{$I LISTE.PAS}   { inclusione del file contenente l'implementazione delle
                   operazioni primitive sulle liste }


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


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


procedure TopPila (p: TipoPila; var v: TipoElemPila);
{ restituisce in v l'elemento affiorante della pila p,
  senza modificare la pila }
begin
  TestaLista(p,v)
end; { TopPila }


procedure Push (var p: TipoPila; v: TipoElemPila);
{ inserisce l'elemento v in cima alla pila p }
begin
  InserisciTestaLista(p,v)
end; { Push }


procedure Pop (var p: TipoPila; var v: TipoElemPila);
{ elimina l'elemento affiorante della pila p, restituendone 
  il valore in v }
begin
  TopPila(p,v);
  CancellaPrimoLista(p)
end; { Pop }