unit LIFO;   (* unit de gestion de pile *)

INTERFACE

type TDonnee = integer;

type Pile = ^Tcase;
     Tcase = record
             n:TDonnee;
             next:Pile;
             end;

procedure init_pile(var p:pile);   (* initialisation de la pile *)
                                   (* attention, l'initialisation ne vide
                                   pas la pile, elle remet juste le
                                   pointeur au depart...
                                   Pour vider la pile, utiliser plusieurs
                                   fois la procedure depile ! *)

function pile_vide(p:pile):boolean; (* retourne true si la pile est vide *)

procedure empile(var p:pile;nb:TDonnee);
(* empile un élément nb au sommet de la pile p *)

procedure depile(var p:pile; var nb:TDonnee;flag:boolean);
(* depile un element de la pile p. Flag retourne true si l'operation a
réussi (si la pile n'était pas vide) *)

IMPLEMENTATION

procedure init_pile(var p:pile);
begin
  p:=nil;       (* c'est encore une fois une convention... *)
end;

function pile_vide(p:pile):boolean;
begin
  pile_vide:=(p=nil);  (* découle de la convention précédemment citée... *)
end;

procedure empile(var p:pile;nb:TDonnee);
var pile_aux:pile;
begin
  new(pile_aux); (* on crée une nouvelle case *)
  pile_aux^.n:=nb;  (* on lui affecte son contenu *)
  pile_aux^.next:=p; (* on la fait pointer sur ce qui était la première case *)
                        (* et qui descent ainsi en profondeur 2 *)
  p:=pile_aux;  (* on fait de la nouvelle case le sommet de la pile *)
end;

procedure depile(var p:pile; var nb:TDonnee;flag:boolean);
var pile_aux:pile;
begin
  if pile_vide(p)
    then flag:=false      (* si pile vide, on ne valide pas le flag *)
    else begin          (* SINON *)
         flag:=true;       (* on valide le flag *)
         pile_aux:=p;      (* on fait pointer pile_aux sur le sommet *)
         nb:=pile_aux^.n;  (* on extrait la donnée dans nb *)
         p:=pile_aux^.next;(* on fait pointer p sur le deuxieme element *)
         dispose(pile_aux);(* on supprime le premier element *)
         end;
end;

END.

