1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| class Pile
{
public:
class Element
{
/* la pile doit pouvoir accéder à la référence vers l'élément
* précédent
*/
friend class Pile;
/* mais rien d'autre ne peut y accéder */
Element* previous;
/* et il faut, bien sur, l'objet à empiler */
Type value;
public:
/* il faut pouvoir construire, copier et assigner
* un élément de la pile... la présence d'un pointeur sur
* l'élément suivant nous oblige à redéfinir nos propres
* constructeurs par copie et opérateur d'affectation
* le tout, sans oublier le constructeur "normal".
*/
/* lorsque l'on crée l'élément de la pile, la référence vers
* l'élément précédentdoit etre initialisée à 0, pour
* nous permettre de repérer le dernier élément de la pile
* (qui est le premier a avoir été empilé)
*/
Element(Type const& value):previous(0),value(value){}
Element(Element const & el):previous(0),value(el.value){}
Element& operator=(Element rhs)
{
value=rhs.value;
previous = 0;
return *this;
}
/* Il ne faut pas pouvoir accéder à l'élément précédent, mais
* il faut pouvoir accéder à l'objet empilé
*/
Type & operator *(){return (this->value);}
Type const& operator*(Element* el) const{return this->value;}
/* un élément a sémantique de pointeur, la fleche est
* intéressante dans ce cadre
*/
Type & operator ->(){return value;}
Type const & operator->() const{return value;}
};
Pile():phead(0){}
/* le destructeur n'est inline que par flegme de ma part */
~Pile()
{
/* tant qu'il y a un élément à la tete, on le détruit */
while(phead)
{
Element* temp=phead->previous;
delete phead;
phead=temp;
}
}
/* la fonction d'empilement aussi d'ailleurs */
void empile(Type const& value)
{
Element * temp=new Element(value);
temp->previous=phead;
phead= temp;
}
bool empty() const{return phead==0;}
size_t size() const
{
if(!phead)
return 0;
size_t ret = 0;
Element* temp=phead;
while(temp)
{
++ret;
temp=temp->previous;
}
return ret;
}
void depile()
{
if(phead)
{
Element* temp=phead->previous;
delete phead;
phead=temp;
}
}
Element & head(){return *phead;}
Element const & head() const{return *phead;}
private:
Element* phead;
}; |
Partager