- La única forma de acceder a los elementos es desde el tope de la pila.
- Su administración es muy sencilla ya que tiene pocas operaciones.
- Si la pila esta vacía no tiene sentido referirse a un tope ni a un fondo.
- En caso de querer acceder a un elemento que nos e encuentre en el tope de la pila se debe realizar un volcado de la pila a una pila auxiliar, una vez realizada la operación con el elemento se vuelve a volcar los elementos de la pila auxiliar a la original.
- apilar (valor): también conocido como push agrega el valor al tope de la pila.
- retirar (): también conocido como pop retira el último elemento apilado.
- cima (): devuelve el valor del elemento que está en la cima de la pila.
- esVacia (): retorna true si la pila no ha sido inicializada.
- buscar (valor): retorna la true si el elemento a buscar existe en la pila.
- eliminar(): elimina la pila
- listar (): imprime en pantalla los elementos de la pila.
package pilas; /** * Clase que define los elementos que debe tener un Nodo de la lista. * @author xavier */ public class Nodo { // Variable en la cual se va a guardar el valor. private int valor; // Variable para enlazar los nodos. private Nodo siguiente; /** * Constructor que inicializamos el valor de las variables. */ public void Nodo(){ this.valor = 0; this.siguiente = null; } // Métodos get y set para los atributos. public int getValor() { return valor; } public void setValor(int valor) { this.valor = valor; } public Nodo getSiguiente() { return siguiente; } public void setSiguiente(Nodo siguiente) { this.siguiente = siguiente; } }
package pilas; /** * Clase que define las operaciones básicas que debe tener una pila. * @author xavier */ public class Pila { // Puntero que indica el inicio de la pila o tambein conocida como el // tope de la pila. private Nodo inicio; // Variable para registrar el tamaño de la pila. private int tamanio; /** * Constructor por defecto. */ public void Pila(){ inicio = null; tamanio = 0; } /** * Consulta si la pila esta vacia. * @return true si el primer nodo (inicio), no apunta a otro nodo. */ public boolean esVacia(){ return inicio == null; } /** * Consulta cuantos elementos (nodos) tiene la pila. * @return numero entero entre [0,n] donde n es el numero de elementos * que contenga la lista. */ public int getTamanio(){ return tamanio; } /** * Agrega un nuevo nodo a la pila. * @param valor a agregar. */ public void apilar(int valor){ // Define un nuevo nodo. Nodo nuevo = new Nodo(); // Agrega al valor al nodo. nuevo.setValor(valor); // Consulta si la pila esta vacia. if (esVacia()) { // Inicializa la pila con el nuevo valor. inicio = nuevo; } // Caso contrario agrega el nuevo nodo al inicio de la pila. else{ nuevo.setSiguiente(inicio); inicio = nuevo; } // Incrementa el contador del tamaño. tamanio++; } /** * Elimina el elemento que se encuentra en el tope de la piala. */ public void retirar(){ if (!esVacia()) { // Asigna como primer nodo al siguiente de la pila. inicio = inicio.getSiguiente(); // Decrementa el contador del tamaño de la pila tamanio--; } } /** * Consulta el valor del nodo que se encuentra en la cima de la pila * @return valor del nodo. * @throws Exception */ public int cima() throws Exception{ if(!esVacia()){ return inicio.getValor(); } else { throw new Exception("La pila se encuentra vacia."); } } /** * Busca un elemento en la pila. * @param referencia valor del nodo a buscar. * @return true si el valor de referencia existe en la pila. */ public boolean buscar(int referencia){ // Crea una copia de la pila. Nodo aux = inicio; // Bandera para verificar si existe el elemento a buscar. boolean existe = false; // Recorre la pila hasta llegar encontrar el nodo o llegar al final // de la pila. while(existe != true && aux != null){ // Compara si el valor del nodo es igual que al de referencia. if (referencia == aux.getValor()) { // Cambia el valor de la bandera. existe = true; } else{ // Avanza al siguiente nodo. aux = aux.getSiguiente(); } } // Retorna el valor de la bandera. return existe; } /** * Elimina un nodo de la pila ubicado por su valor. * @param referencia valor de referencia para ubicar el nodo. */ public void remover(int referencia){ // Consulta si el valor existe en la pila. if (buscar(referencia)) { // Crea una pila auxiliar para guardar los valores que se // vayan desapilando de la pila original. Nodo pilaAux = null; // Recoore la pila hasta llegar al nodo que tenga el valor // igual que el de referencia. while(referencia != inicio.getValor()){ // Crea un nodo temporal para agregarlos a la pila auxiliar. Nodo temp = new Nodo(); // Ingresa el valor al nodo temporal. temp.setValor(inicio.getValor()); // Consulta si la pila auxiliar no a sido inicializada. if(pilaAux == null){ // Inicializa la pila auxiliar. pilaAux = temp; } // Caso contrario si la pila auxiliar ya contiene elementos // los agrega al inicio. else{ temp.setSiguiente(pilaAux); pilaAux = temp; } // Elimina el nodo del tope de la pila hasta llegar al nodo // que se desea eliminar. retirar(); } // Elimina el nodo que coincide con el de referencia. retirar(); // Regresa los valores de la pila auxiliar a la pila original // mientras la pila auxiliar tenga elementos. while(pilaAux != null){ // Utiliza el metodo apilar para regresar los elementos a // la pila original. apilar(pilaAux.getValor()); // Avansa al siguiente nodo de la pila auxiliar. pilaAux = pilaAux.getSiguiente(); } // Libera la memoria utilizada por la pila auxiliar. pilaAux = null; } } /** * Actualiza el valor de un nodo en la pila. * @param referencia valor del nodo para ubicar el que se desea actualizar. * @param valor por el cual se desea remplazar el valor del nodo. */ public void editar(int referencia, int valor){ // Consulta si el nodo existe en la pila if (buscar(referencia)) { // Crea una pila auxiliar. Nodo pilaAux = null; // Recoore la pila hasta llegar al nodo que tenga el valor // igual que el de referencia. while(referencia != inicio.getValor()){ // Crea un nodo temporal para agregarlos a la pila auxiliar. Nodo temp = new Nodo(); // Ingresa el valor al nodo temporal. temp.setValor(inicio.getValor()); // Consulta si la pila auxiliar no a sido inicializada. if(pilaAux == null){ // Inicializa la pila auxiliar. pilaAux = temp; } // Caso contrario si la pila auxiliar ya contiene elementos // los agrega al inicio. else{ temp.setSiguiente(pilaAux); pilaAux = temp; } // Elimina el nodo del tope de la pila hasta llegar al nodo // que se desea eliminar. retirar(); } // Actualiza el valor del nodo. inicio.setValor(valor); // Regresa los valores de la pila auxiliar a la pila original // mientras la pila auxiliar tenga elementos. while(pilaAux != null){ // Utiliza el metodo apilar para regresar los elementos a // la pila original. apilar(pilaAux.getValor()); // Avansa al siguiente nodo de la pila auxiliar. pilaAux = pilaAux.getSiguiente(); } // Libera la memoria utilizada por la pila auxiliar. pilaAux = null; } } /** * Elimina la pila */ public void eliminar(){ // Elimina el valor y la referencia a los demas nodos. inicio = null; // Reinicia el contador a 0. tamanio = 0; } /** * Despliega en pantalla los elementos de la pìla. */ public void listar(){ // Crea una copia de la pila. Nodo aux = inicio; // Recorre la pila hasta el ultimo nodo. while(aux != null){ System.out.println("|\t" + aux.getValor() + "\t|"); System.out.println("-----------------"); aux = aux.getSiguiente(); } } }
package pilas; /** * Clase principa que implementa los metodos de la clase pila. * @author xavier */ public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { Pila pila = new Pila(); System.out.println("<<-- Ejemplo de Pila -->>\n\n"); pila.apilar(4); pila.apilar(16); pila.apilar(12); pila.apilar(8); pila.apilar(65); System.out.println("<<-- Pila -->>"); pila.listar(); System.out.println("\n<<-- Tamaño -->"); System.out.println(pila.getTamanio()); System.out.println("\n<<-- Retirar el elemento del tope de la pila -->>"); pila.retirar(); pila.listar(); System.out.println("Tamaño: " + pila.getTamanio()); System.out.println("\n<<-- Actualizar el valor del nodo con el valor 12 por 24 -->>"); pila.editar(12, 44); pila.listar(); System.out.println("Tamaño: " + pila.getTamanio()); System.out.println("\n<<-- Eliminar el nodo con el valor 16 -->>"); pila.remover(16); pila.listar(); System.out.println("Tamaño: " + pila.getTamanio()); System.out.println("\n<<-- Consulta si existe el valor 65 -->>"); System.out.println(pila.buscar(65)); System.out.println("\n<<-- Elimina la pila -->>"); pila.eliminar(); System.out.println("\n<<-- Consulta si la pila esta vacia -->>"); System.out.println(pila.esVacia()); System.out.println("\n\n<<-- Fin de ejemplo pila -->>"); } }