-- Auteurs : P. E.
-- Version du 30/01/2019

package Piles_Entiers is

   type Pile is limited private;

   Pile_Vide : exception;
   -- exception levee si on tente d'acceder au sommet d'une pile vide
   -- ou si on tente de depiler une pile vide.

   -- ****************************************
   -- OPERATIONS INDISPENSABLES DU T.A.D. PILE
   -- ****************************************

   procedure Init(P : in out Pile);
   -- Ne fait rien si P est deja vide a l'appel
   -- Sinon efface tous les elements de P (en
   -- recuperant la memoire allouee)
   -- et retourne la pile vide

   function  Est_Vide(P : in Pile) return Boolean;
   -- Retourne vrai si la pile est vide, faux sinon

   function  Sommet(P : in Pile) return Integer;
   -- Retourne le premier element de P (situe au sommet)

   procedure Empiler(E : in Integer; P : in out Pile);
   -- Empile E au dessus de P ; E devient le nouveau sommet

   procedure Depiler(P: in out Pile);
   -- Efface le sommet de P ; attention, penser a recuperer
   -- la memoire associee a la cellule a effacer

   -- **************************************
   -- OPERATIONS FACULTATIVES DU T.A.D. PILE
   -- **************************************

   function Hauteur(P : in Pile) return Natural;
   -- Calculer la hauteur en comptant le nombre d'elements depilables
   -- n'est pas efficace. Cette fonction accede directement au champ
   -- hauteur du record associe a une pile

   function To_String(P : in Pile) return String;
   -- Convertit une pile d'entiers en une chaine de caracteres

   function "="(P1,P2 : in Pile) return boolean;
   -- Verifie que les piles sont identiques (memes elements et meme ordre)

private
   type Cellule;
   type Liste   is access Cellule;
   type Cellule is record
        Info : Integer;
        Suiv : Liste;
   end record;

   type Pile is record
        Debut  : Liste   := null;
        Hauteur: Natural := 0;
   end record;

end Piles_Entiers;
