#ifndef STACK_H // Fichier Stack.h #define STACK_H #include #include using namespace std; template class Stack; template // Pour les fonctions ostream& operator<<(ostream& os, const Stack& s); // friend template. // Il faut aussi <> const int MAX = 10; template class Stack { friend ostream& operator<< <>(ostream& os, const Stack& s); public : Stack(void) : _size(0) {} Stack(const Stack& s) { _copy(s); } Stack& operator=(const Stack& s) { if (this != &s) { _destroy(); _copy(s); } return *this; } virtual ~Stack(void) {} bool empty(void) const { return _size == 0; } int size(void) const { return _size; } const T& top(void) const { assert(!empty()); return _stack[_size - 1]; } void push(const T& t) { assert(_size < MAX); _stack[_size++] = t; } T pop(void) { assert(!empty()); return _stack[--_size]; } private : T _stack[MAX]; int _size; void _copy(const Stack& s) { _size = s._size; for(int i=0; i< _size; i++) { _stack[i] = s._stack[i]; } } void _destroy(void) {} }; template ostream& operator<<(ostream& os, const Stack& s) { os << endl ; os << " Une Stack :" << endl; for(int i=s._size-1; i>=0; i--) { if (s._size==1) os << "sommet & fond : "; else if (i==s._size-1) os << " sommet : "; else if (i==0) os << " fond : "; else os << " "; os << s._stack[i]; os << endl; } os << "~~~~~~~~~~~~~~~" << endl; return os; } #endif // STACK_H