IMPLEMENTACIÓN DE PILAS CON LISTAS EN C++ Fichero nodo.h #ifndef NODO_H #define NODO_H const int cantidad_nodos = 10; class Nodo private: string dato; Nodo* siguiente; public: Nodo(); void setdato(string inf); void setsiguiente(nodo* sig); string getdato(); Nodo* getsiguiente(); virtual ~Nodo(); ; #endif // NODO_H Fichero nodo.cpp Nodo::Nodo() dato = ""; siguiente = NULL; void Nodo::setDato(string inf) dato = inf; void Nodo::setSiguiente(Nodo* sig) siguiente = sig; string Nodo::getDato() return dato; Nodo* Nodo::getSiguiente() return siguiente; Nodo::~Nodo() //dtor
Fichero declararpila.h #ifndef DECLARARPILA_H #define DECLARARPILA_H class DeclararPila private: int totalnodos; Nodo* tope; public: DeclararPila(); int gettotalnodos(); //Método que devuelve la cantidad de nodos que tiene la pila. Nodo* gettope(); //Método que devuelve el nodo del tope de la pila. //Métodos para determinar el estado de la pila (pila llena o pila vacía). Para esto se declaran dos funciones //de tipo booleano. Si la pila esta Llena se retorna el valor de true, en caso contrario se retorna el valor false. //Lo mismo si la pila esta vacía se retorna el valor de true, en caso contrario se retorna el valor false. bool pilallena(); bool pilavacia(); void agregar(string dato); void quitar(); string valortope(); void limpiarpila(); virtual ~DeclararPila(); ; #endif // DECLARARPILA_H Fichero declararpila.cpp #include "declararpila.h" DeclararPila::DeclararPila() totalnodos = 0; tope = NULL; int DeclararPila::getTotalNodos() //El atributo totalnodos es un contador de nodos que devuelve la cantidad de nodos almacenados en la pila. return totalnodos; Nodo* DeclararPila::getTope() return tope; bool DeclararPila::pilaLlena() if (gettotalnodos() == cantidad_nodos) return true; else return false;
bool DeclararPila::pilaVacia() if (gettotalnodos() == 0) return true; else return false; void DeclararPila::agregar(string dato) //Nodo* nuevo; if (! pilallena()) //Mientras que la pila no este llena se pueden agregar nodos. Nodo* nuevo = new Nodo(); //Se crea una nueva instancia de la clase nodo. nuevo->setdato(dato); //Al nodo nuevo en el campo de información se le agrego el dato. nuevo->setsiguiente(gettope()); //El apuntador del nuevo nodo apunta al que esta de tope (cabeza). tope = nuevo; //Se asigna que el tope será en nuevo nodo insertado. totalnodos = totalnodos+1; //Se incrementa el contador de nodos en uno. void DeclararPila::quitar() Nodo* temp; //Apuntador de la clase nodo para almacenar temporalmente el nodo a eliminar (tope). if (! pilavacia()) //Mientras que la pila no este vacía se pueden eliminar nodos. temp = gettope(); //Se asigna temporalmente el tope de la pila a el apuntador temp. tope = tope->getsiguiente(); //Ahora el tope será el nodo que que sigue al que estaba de tope. delete temp; //Se elimina temp. totalnodos = totalnodos-1; //El contador de nodos se decremento en uno. string DeclararPila::valorTope() return tope->getdato(); //Retorna la información que tiene el nodo del tope en el campo dato. void DeclararPila::limpiarPila() //Implementación del método que elimina todos los nodos de la pila. while (! pilavacia()) quitar(); DeclararPila::~DeclararPila() limpiarpila(); Fichero main.cpp #include "declararpila.h" int menu(); //Método para asignar un menú de opciones. void mostrarpila(declararpila* pila); //Método para mostrar los datos de la pila. int main() int opc; string dato; DeclararPila* pila = new DeclararPila();
do opc = menu(); switch(opc) case 1: cout << "\n AGREGAR DATOS A LA PILA \n"; cout << "Digite el dato que quiere agregar a la Pila: "; cin >> dato; if (! pila->pilallena()) pila->agregar(dato); else cout << " ---> La pila esta llena, No puede agregar mas elementos"; case 2: cout << "\n ELIMINAR DATOS DE LA PILA \n"; if (! pila->pilavacia()) pila->quitar(); else cout << "---> La pila esta vacia, No pueden quitar datos"; case 3: cout << "\n MOSTRAR DATOS DE LA PILA \n"; case 4: cout << "\n VACIAR LA PILA - BORRAR TODOS LOS ELEMENTOS \n"; pila->limpiarpila(); cout << "Se eliminaron los datos de la pila..."; cout << "\n \n"; case 5:
while(opc!= 5); int menu() int opcion = 0; cout << "\n IMPLEMENTACION DE PILAS - OPCION DEL MENU \n"; cout << "\n1. Agregar Datos a la Pila\n"; cout << "2. Eliminar Datos de la Pila\n"; cout << "3. Mostrar Datos de la Pila\n"; cout << "4. Vaciar la Pila\n"; cout << "5. Salir\n"; do cout << "\nseleccione una opcion del 1 al 5: "; cin >> opcion; while(opcion <= 0 opcion > 5); return opcion; void mostrarpila(declararpila* pila) //Así se mueven los elementos de la pila, siempre por el tope. cout << "\nelementos de la pila: \n \n"; //Objetos de la clase DeclararPila, para crear una pila temporal en donde almacenar los datos. DeclararPila* temp = new DeclararPila(); while (! pila->pilavacia()) //Mientras la pila no este vacía se muestran sus datos. cout << "---> " << pila->valortope() << "\n"; temp->agregar(pila->valortope()); //Se Agrega a una pila temporal el valor del tope de la pila actual. pila->quitar(); //Se elimina el tope de la pila actual, para pasar al siguiente elemento. //Posteriormente se copia nuevamente la pila temporal hasta la pila original. while (! temp->pilavacia()) pila->agregar(temp->valortope()); //Se agrega a la pila original el valor del tope de la pila temporal. temp->quitar(); //Se elimina el tope de la pila temporal, para pasar al siguiente elemento.