/* ATTENTION : cette solution est adaptée à l'énoncé de l'exercice, mais n'est pas complète au point d'en faire une classe réutilisable par quiconque. Il faudrait redéfinir le constructeur de recopie, l'opérateur d'affectation, traiter les exceptions... */ #define NULL 0 template class PileNonBornee { private: class Chainon { public: T elt; Chainon* suiv; public: Chainon(T e, Chainon* s = NULL) : elt(e), suiv(s) {}; ~Chainon() { if (suiv) delete suiv; }}; private: Chainon* dernier; public: PileNonBornee(); ~PileNonBornee(); public: PileNonBornee& empiler(T); PileNonBornee& depiler(); T sommet(); bool est_vide(); }; template PileNonBornee::PileNonBornee() : dernier(NULL) {}; template PileNonBornee::~PileNonBornee() { if (dernier != NULL) delete dernier; }; template PileNonBornee& PileNonBornee::empiler(T e) { dernier = new Chainon(e, dernier); return *this; }; template PileNonBornee& PileNonBornee::depiler() { if (dernier) { Chainon* t = dernier->suiv; dernier->suiv = NULL; delete dernier; dernier = t; }; return *this; }; template T PileNonBornee::sommet() { if (dernier) return dernier->elt; }; template bool PileNonBornee::est_vide() { return dernier == NULL; };