Pilas Implementación con gestión estática de memoria Estructuras de Datos y de la Información ESI – Curso 2010/2011 Esquema general cima = 2 12 2 1 Estructuras de Datos y de la Información ESI – Curso 2010/2011 Esquema general cima = 3 7 12 2 1 Estructuras de Datos y de la Información ESI – Curso 2010/2011 Esquema general cima = 2 12 1 2 12 2 0 1 2 ... n 1 Estructuras de Datos y de la Información ESI – Curso 2010/2011 Esquema general cima = 3 7 cima = 2 12 1 2 12 7 2 0 1 2 3 ... 1 Estructuras de Datos y de la Información ESI – Curso 2010/2011 Esquema general Desapilar sólo implica actualizar la cima cima = 3 7 cima = 2 12 1 2 12 7 2 0 1 2 3 ... 1 Estructuras de Datos y de la Información ESI – Curso 2010/2011 Esquema general cima = 3 7 cima = 2 12 1 2 12 7 2 0 1 2 3 ... 1 Estructuras de Datos y de la Información ESI – Curso 2010/2011 Esquema general ● Caso especial. – Pila vacía. ... -1 0 1 Estructuras de Datos y de la Información 2 3 n ESI – Curso 2010/2011 Implementación :: Interfaz public interface Pila<X> { public boolean esVacia (); public void apilar (X v) throws DesbordamientoPilaException; public void desapilar () throws PilaVaciaException; public X cima () throws PilaVaciaException; public String toString (); public boolean equals (Object o); } Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: Pila Estática // Pila con reserva de memoria estática. class PilaEstatica<X> implements Pila<X> { // Elementos de la pila. private X[] _elementos; // Capacidad de la pila. private int _maxElementos; // Cima de la pila. private int _cima; Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: Constructores public PilaEstatica (int maxElementos) { _cima = -1; _maxElementos = maxElementos; // Java no permite arrays // de tipos genéricos. _elementos = (X[])new Object[_maxElementos]; } public PilaEstatica () { _cima = -1; _maxElementos = 10; _elementos = (X[])new Object[_maxElementos]; } Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: Constructores public PilaEstatica (int maxElementos) { _cima = -1; _maxElementos = maxElementos; // Java no permite arrays // de tipos genéricos. _elementos = (X[])new Object[_maxElementos]; } public PilaEstatica () { _cima = -1; _maxElementos = 10; _elementos = (X[])new Object[_maxElementos]; } Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: esVacía () public boolean esVacia () { return _cima == -1; } ... -1 0 1 Estructuras de Datos y de la Información 2 3 n ESI – Curso 2010/2011 Implementación :: apilar () public void apilar (X v) throws DesbordamientoPilaException { try { // Actualizamos la cima. // Almacenamos en la pila el valor v. _elementos[++_cima] = v; } catch (ArrayIndexOutOfBoundsException ex) { System.err.println(ex.toString()); throw new DesbordamientoPilaException ("La pila alcanza el tamaño: " + _maxElementos); } } Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: apilar () ● Incrementar el valor de cima. ● Almacenar el nuevo contenido en la pila. ... -1 0 1 Estructuras de Datos y de la Información 2 3 n ESI – Curso 2010/2011 Implementación :: apilar () public void apilar (X v) throws DesbordamientoPilaException { try { // Actualizamos la cima. // Almacenamos en la pila el valor v. _elementos[++_cima] = v; } catch (ArrayIndexOutOfBoundsException ex) { System.err.println(ex.toString()); throw new DesbordamientoPilaException ("La pila alcanza el tamaño: " + _maxElementos); } } Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: apilar () public void apilar (X v) throws DesbordamientoPilaException { try { // Actualizamos la cima. // Almacenamos en la pila el valor v. _elementos[++_cima] = v; } catch (ArrayIndexOutOfBoundsException ex) { System.err.println(ex.toString()); throw new DesbordamientoPilaException ("La pila alcanza el tamaño: " + _maxElementos); } } Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: desapilar () 1 2 12 7 0 1 2 3 Estructuras de Datos y de la Información ... n ESI – Curso 2010/2011 Implementación :: desapilar () 1 2 12 7 0 1 2 3 Estructuras de Datos y de la Información ... n ESI – Curso 2010/2011 Implementación :: desapilar () public void desapilar () throws PilaVaciaException { if (esVacia()) throw new PilaVaciaException(); else // Actualizamos la cima. // No es necesario modificar _elementos. _cima--; } Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: desapilar () public void desapilar () throws PilaVaciaException { if (esVacia()) throw new PilaVaciaException(); else // Actualizamos la cima. // No es necesario modificar _elementos. _cima--; } Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: desapilar () public void desapilar () throws PilaVaciaException { if (esVacia()) throw new PilaVaciaException(); else // Actualizamos la cima. // No es necesario modificar _elementos. _cima--; } Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: cima () public X cima () throws PilaVaciaException { if (esVacia()) throw new PilaVaciaException(); else return _elementos[_cima]; } Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: cima () public X cima () throws PilaVaciaException { if (esVacia()) throw new PilaVaciaException(); else return _elementos[_cima]; } ... -1 0 1 Estructuras de Datos y de la Información 2 3 n ESI – Curso 2010/2011 Implementación :: cima () public X cima () throws PilaVaciaException { if (esVacia()) throw new PilaVaciaException(); else return _elementos[_cima]; } 1 2 12 7 0 1 2 3 Estructuras de Datos y de la Información ... n ESI – Curso 2010/2011 Implementación :: equals () public boolean equals (Object o) { boolean iguales = o instanceof PilaEstatica; int n = 0; // Si tenemos una pila distinta a la actual. if (iguales && this != o) { // Comparamos la longitud de las pilas. iguales = (_cima == ((PilaEstatica)o)._cima); // ... Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: equals () Pila p cima = 2 Pila aux 12 cima = 2 12 2 2 1 1 Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: equals () public boolean equals (Object o) { boolean iguales = o instanceof PilaEstatica; int n = 0; // Si tenemos una pila distinta a la actual. if (iguales && this != o) { // Comparamos la longitud de las pilas. iguales = (_cima == ((PilaEstatica)o)._cima); // ... Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: equals () Pila p cima = 2 Pila aux 12 cima = 2 12 2 13 1 1 Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: equals () public boolean equals (Object o) { // ... // Si tenemos una pila distinta a la actual. if (iguales && this != o) { // ... } } // Comparamos mientras los elementos // vayan siendo iguales. while (iguales && n <= _cima) { iguales = _elementos[n].equals( ((PilaEstatica)o)._elementos[n]); n++; } return iguales; Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: equals () public boolean equals (Object o) { // ... // Si tenemos una pila distinta a la actual. if (iguales && this != o) { // ... } } // Comparamos mientras los elementos // vayan siendo iguales. while (iguales && n <= _cima) { iguales = _elementos[n].equals( ((PilaEstatica)o)._elementos[n]); n++; } return iguales; Estructuras de Datos y de la Información ESI – Curso 2010/2011 Implementación :: equals () public boolean equals (Object o) { // ... // Si tenemos una pila distinta a la actual. if (iguales && this != o) { // ... } } // Comparamos mientras los elementos // vayan siendo iguales. while (iguales && n <= _cima) { iguales = _elementos[n].equals( ((PilaEstatica)o)._elementos[n]); n++; } return iguales; Estructuras de Datos y de la Información ESI – Curso 2010/2011