Petit exemple banal de pile générique sur la base d'un
type T, dont la capacité est déterminée
de manière dynamique (il n'y a pas de plafond a priori
sur le nombre d'éléments qu'elle peut contenir).
Je vous invite à le raffiner (ajouter la sémantique de
copie et la sémantique de mouvement, en particulier).
Si votre compilateur n'est pas conforme au standard C++ 11,
remplacez nullptr par
0 tout simplement.
|
#ifndef PILE_H
#define PILE_H
//
// Pouvez-vous identifier des invariants?
//
#include "Incopiable.h"
class Vide {};
template <class T>
class Pile
: Incopiable
{
public:
using value_type = T; // type interne et public
private:
struct Noeud
{
value_type val_;
Noeud *pred_;
Noeud(const value_type &val)
: val_{val}, pred_{}
{
}
};
Noeud *tete_;
public:
Pile() noexcept
: tete_{}
{
}
bool empty() const noexcept
{ return !tete_; }
bool full() const noexcept
{ return false; }
void push(const value_type &val)
{
auto p = new Noeud(val);
p->pred_ = tete_;
tete_ = p;
}
void pop()
{
if(empty()) throw Vide{};
auto p = tete_->pred_;
delete tete_;
tete_ = p;
}
value_type& top()
{
if(empty()) throw Vide{};
return tete_->val_;
}
~Pile() noexcept
{ while (!empty()) pop(); }
};
#endif
|