#include #include using namespace std; const int DIM_MAX = 10; template class Pila { public: // Costruttore di default. Pila(); // Distruttore. ~Pila(); // Costruttore per copia Pila(const Pila& p); // Operatore di assegnamento Pila& operator=(const Pila& p); // Inserisce l'elemento `x' nella pila. void push(T x); // Estrae un elemento dalla pila. T pop(); // Ritorna `true' se la pila e' vuota; // `false' altrimenti bool empty() const; // Ritorna la capacita' della pila. unsigned int capacita() const; // Ritorna il numero di elementi contenuti nella pila. unsigned int num_elementi() const; private: // Puntatore ad un array di int che rappresenta la pila stessa. T* A; // Indica quanti elementi ci sono nella pila. int top; // Capacita' della pila. int dim; // Raddoppia la dimensione della pila. void raddoppia(); }; template Pila::Pila() { A = new T[DIM_MAX]; top = 0; dim = DIM_MAX; } template Pila::~Pila() { delete[] A; } template Pila::Pila(const Pila& p) { A = new T[p.dim]; for (unsigned int i = 0; i < p.dim; i++) A[i] = p.A[i]; top = p.top; dim = p.dim; } template Pila& Pila::operator=(const Pila& p) { int dim_min = dim < p.dim ? dim : p.dim; for (unsigned int i = 0; i < dim_min; i++) A[i] = p.A[i]; top = p.top; dim = dim_min; return *this; } template void Pila::push(T x) { if (top == DIM_MAX) raddoppia(); A[top] = x; ++top; } template T Pila::pop() { if (empty()) throw "Invocato metodo `pop()' su pila vuota!"; --top; return A[top]; } template bool Pila::empty() const { if (top == 0) return true; else return false; } template unsigned int Pila::capacita() const { return DIM_MAX; } template unsigned int Pila::num_elementi() const { return top; } template void Pila::raddoppia() { T* tmp = new T[2*dim]; for (int i = 0; i < dim; ++i) tmp[i] = A[i]; delete[] A; dim *= 2; A = tmp; } //%%%%%%%%%%%%%%%%%%%%%%% main di prova int main() try { Pila P1; Pila P2; P1.push('a'); P2.push('a'); while (!P1.empty()) cout << P1.pop() << endl; while (!P2.empty()) cout << P2.pop() << endl; getch(); return 0; } catch(const char* str) { cerr << "Eccezione: " << str << endl; getch(); }