// IG17 2004-05, II17 2005-06 // Pila.cpp // 17-12-2004 #include using namespace std; #include "Pila.h" template Pila::Nodo::Nodo(const T & d, Nodo *s) : dato(d), sig(s) { } template Pila::Pila() : datos(NULL), talla(0) { } template Pila::Pila (const Pila & p) : datos(NULL), talla(0) { *this = p; } template Pila & Pila::operator= (const Pila &p) { if (this != &p) { Nodo *anterior; Vaciar(); talla = p.talla; for (Nodo *aux = p.datos; aux != NULL; aux = aux->sig) { Nodo *nuevo = new Nodo(aux->dato); if (datos == NULL) anterior = datos = nuevo; else anterior = anterior->sig = nuevo; } } return *this; } template Pila::~Pila(){ Vaciar(); } template void Pila::Ver() const { cout << "["; for (Nodo *aux = datos; aux != NULL; aux = aux->sig) { cout << aux->dato; if (aux->sig != NULL) cout << ","; } cout << "] (talla = " << talla << ")" << endl; } template void Pila::Apilar(const T & d) { datos = new Nodo(d, datos); talla++; // Asi se mantiene el campo talla actualizado, // lo que permite que el coste de Talla() sea O(1), // y el coste de Apilar(d) sigue siendo O(1). } template void Pila::Desapilar() { if (datos != NULL) { Nodo *aux = datos; datos = datos->sig; delete aux; talla--; } } template int Pila::Talla() const { return talla; } template bool Pila::EstaVacia() const { return talla==0; } template void Pila::Vaciar(){ Nodo *aux; while(datos != NULL) { aux = datos; datos = datos->sig; delete aux; } talla = 0; } // Otra solucion, algo mas estructurada, algo menos eficiente // template // void Pila::Vaciar(){ // while(! EstaVacia()) // Desapilar(); // } template T & Pila::Tope() throw(int) { if(datos != NULL) return datos->dato; else throw -1; }