Pilas

2.763 visualizaciones

Publicado el

Publicado en: Empresariales, Tecnología
0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
2.763
En SlideShare
0
De insertados
0
Número de insertados
3
Acciones
Compartido
0
Descargas
62
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

Pilas

  1. 1. Pilas <ul><li>Pilas </li></ul><ul><li>1.1 Descripción del TDA Pila. </li></ul><ul><li>1.2 Especificación del TDA Pila. </li></ul><ul><li>1.3 Ejemplos de uso. </li></ul><ul><li>1.4 Implementaciones del TDA Pila. </li></ul><ul><li> 1.1.1 Implementación basada en el TDA Lista. </li></ul><ul><li> 1.1.2 Implementación con vectores. </li></ul><ul><li> 1.1.3 Implementación con apuntadores. </li></ul><ul><li> 1.1.4 Comparación de las implementaciones. </li></ul>
  2. 2. 1.1 Descripción del TDA Pila <ul><li>Una  pila es un caso especial de lista en la cual todas las inserciones y supresiones tienen lugar en un extremo determinado llamado tope . </li></ul><ul><li>A las pilas se les llama también listas LIFO (last-in first-out) o listas “primero en entrar, primero en salir”. </li></ul><ul><li>Al igual que ocurría con el TDA Cola, en el TDA Pila tampoco se definen operaciones de posicionamiento en la pila. Esto es debido a que todas las operaciones de acceso se realizan en la misma posición, el tope de la pila. </li></ul>
  3. 3. 1.1 Descripción del TDA Pila <ul><li>Un   TDA de la familia pila incluye a menudo   las   cinco </li></ul><ul><li>operaciones siguientes: </li></ul><ul><li>  </li></ul><ul><ul><li>CREA. Crea una pila vac í a. </li></ul></ul><ul><ul><li>VACIA. Devuelve un valor cierto si la pila est á vac í a, y falso en caso contrario. </li></ul></ul><ul><ul><li>TOPE. Devuelve el elemento situado el tope de la pila, sin extraerlo. </li></ul></ul><ul><ul><li>  PUSH. A ñ ade un elemento a la pila, quedando é ste situado en el tope. </li></ul></ul><ul><ul><li>POP. Suprime el elemento situado en el tope de la pila. </li></ul></ul>
  4. 4. 1.2 Especificación del TDA Pila <ul><li>Especificaci ó n informal del TDA Pila </li></ul><ul><li>Pila = TDA con operaciones crea, vacia, tope, push, pop . </li></ul><ul><li>DESCRIPCI Ó N: </li></ul><ul><ul><li>Los valores del TDA Pila son pilas de elementos del tipo Elemento .   Las pilas son mutables: push y pop a ñ aden y   eliminan elementos en la pila respectivamente. </li></ul></ul><ul><li>  </li></ul><ul><li>OPERACIONES: </li></ul><ul><ul><li>crea() devuelve (P:Pila) </li></ul></ul><ul><ul><ul><li>efecto: Devuelve la pila vac í a P </li></ul></ul></ul>
  5. 5. 1.2 Especificación del TDA Pila <ul><ul><li>vacia(P:Pila) devuelve (booleano) </li></ul></ul><ul><ul><ul><li>efecto: Devuelve cierto si P es la pila vac í a, y falso en caso contrario. </li></ul></ul></ul><ul><ul><li>tope(P:Pila) devuelve (E:Elemento) </li></ul></ul><ul><ul><ul><li>requerimientos: La pila P es no vac í a . </li></ul></ul></ul><ul><ul><ul><li>efecto: Devuelve en E el elemento situado en el tope de la pila P </li></ul></ul></ul><ul><ul><li>push(P:Pila; E:Elemento) </li></ul></ul><ul><ul><ul><li>modifica: P </li></ul></ul></ul><ul><ul><ul><li>efecto: A ñ ade el elemento E a la pila P, quedando é ste situado en el tope. </li></ul></ul></ul><ul><ul><li>pop(P:Pila) </li></ul></ul><ul><ul><ul><li>requerimientos: La pila P es no vac í a. </li></ul></ul></ul><ul><ul><ul><li>modifica: P </li></ul></ul></ul><ul><ul><ul><li>e fecto: Suprime el elemento situado en el tope de la pila </li></ul></ul></ul>
  6. 6. 1.2 Especificación del TDA Pila <ul><li>Especificación Formal </li></ul><ul><li>Tipo: Pila (Elemento) </li></ul><ul><li>Sintaxis: </li></ul><ul><ul><li>crea  Pila </li></ul></ul><ul><ul><li>vacia(Pila)  booleano </li></ul></ul><ul><ul><li>tope(Pila)  Elemento </li></ul></ul><ul><ul><li>push(Pila,Elemento)  Pila </li></ul></ul><ul><ul><li>pop(Pila)  Pila </li></ul></ul><ul><li>Semántica:  P  Pila,  E  Elemento: </li></ul><ul><ul><li>vacia(crea)  cierto </li></ul></ul><ul><ul><li>vacia( push(P ,E))  falso </li></ul></ul><ul><ul><li>tope (crea)  error </li></ul></ul><ul><ul><li>tope ( push ( P ,E))  E </li></ul></ul><ul><ul><li>pop (crea)  error </li></ul></ul><ul><ul><li>pop ( push ( P ,E))  P </li></ul></ul>
  7. 7. 4.2 Especificación del TDA Pila <ul><li>La interface Java del TDA Pila de acuerdo a esta </li></ul><ul><li>especificación puede definirse de la siguiente forma: </li></ul><ul><li>package pilaInterface; </li></ul><ul><li>import pilaException.*; </li></ul><ul><li>public interface Pila { </li></ul><ul><li>    public boolean vacia(); </li></ul><ul><li>    public Object tope() throws PilaVaciaException; </li></ul><ul><li>    public void push(Object elemento); </li></ul><ul><li>    public void pop() throws PilaVaciaException; </li></ul><ul><li>}  // fin interface Pila </li></ul>
  8. 8. 1.2 Especificación del TDA Pila <ul><li>La s excepciones para Cola : </li></ul><ul><li>package pilaException; </li></ul><ul><li>public class PilaException extends Exception { </li></ul><ul><li>    public PilaException() { super(); }; </li></ul><ul><li>    public PilaException(String s) { super(s); }; </li></ul><ul><li>} </li></ul><ul><li>package pilaException; </li></ul><ul><li>public class PilaVaciaException extends PilaException { </li></ul><ul><li>    public PilaVaciaException() { super(); }; </li></ul><ul><li>    public PilaVaciaException(String s) { super(s); };   </li></ul><ul><li>} </li></ul>
  9. 9. 1.3 Ejemplos de Uso <ul><li>import pilaInterface.*; </li></ul><ul><li>import pilaException.*; </li></ul><ul><li>import java.io.*; </li></ul><ul><li>public class PilaUtil { </li></ul><ul><li>   static public void imprimir(Pila pila) { </li></ul><ul><li>        try { </li></ul><ul><li>            Pila pilaAux = duplicar(pila); </li></ul><ul><li>            while (!pilaAux.vacia()) { </li></ul><ul><li>                Object e = pilaAux.tope(); </li></ul><ul><li>                pilaAux.pop(); </li></ul><ul><li>                System.out.print(e+&quot; &quot;); </li></ul><ul><li>            } </li></ul><ul><li>            System.out.println(); </li></ul><ul><li>        } catch (PilaException e) { </li></ul><ul><li>            System.err.println(&quot;Error en el uso de la Pila: &quot;+e); </li></ul><ul><li>        } </li></ul><ul><li>    } // fin imprimir() </li></ul>
  10. 10. 1.3 Ejemplos de Uso <ul><li>   static public Pila duplicar(Pila pila) { </li></ul><ul><li>        try { </li></ul><ul><li>            Pila pila2 = (Pila)pila.getClass().newInstance(); </li></ul><ul><li>            Pila pilaAux = (Pila)pila.getClass().newInstance(); </li></ul><ul><li>            while (!pila.vacia()) { </li></ul><ul><li>                Object e = pila.tope(); pila.pop(); pilaAux.push(e); </li></ul><ul><li>            } </li></ul><ul><li>            while (!pilaAux.vacia()) { </li></ul><ul><li>                Object e = pilaAux.tope(); pilaAux.pop(); </li></ul><ul><li>                pila.push(e); pila2.push(e); </li></ul><ul><li>            } </li></ul><ul><li>            return pila2; </li></ul><ul><li>        } catch (PilaException e) { </li></ul><ul><li> System.err.println(&quot;Error en el uso de la Pila: &quot;+e); </li></ul><ul><li>        } catch (Exception e) { System.err.println(e); } </li></ul><ul><li>        return null; </li></ul><ul><li>    } // fin duplicar() </li></ul><ul><li>  } // fin class PilaUtil </li></ul>
  11. 11. 1.3 Ejemplos de Uso <ul><li>import colaInterface.*; </li></ul><ul><li>import pilaBasadaLista.*; </li></ul><ul><li>import colaException.*; </li></ul><ul><li>import pilaException.*; </li></ul><ul><li>import java.io.*; </li></ul><ul><li>  </li></ul><ul><li>class ColaUtil { </li></ul><ul><li>  </li></ul><ul><li>    // métodos de la clase ColaUtil </li></ul><ul><li>  </li></ul><ul><li>    static public Cola invertir(Cola cola) { </li></ul><ul><li>        try { </li></ul><ul><li>            Pila pilaAux = new Pila(); </li></ul><ul><li>            Cola colaAux = duplicar(cola); </li></ul><ul><li>            while(!colaAux.vacia()) { </li></ul><ul><li>                Object e = colaAux.primero(); </li></ul><ul><li>                colaAux.suprime(); </li></ul><ul><li>                pilaAux.push(e); </li></ul><ul><li>            } </li></ul>
  12. 12. 1.3 Ejemplos de Uso <ul><li>            Cola cola2 = (Cola)cola.getClass().newInstance(); </li></ul><ul><li>            while(!pilaAux.vacia()) { </li></ul><ul><li>                Object e = pilaAux.tope(); </li></ul><ul><li>                pilaAux.pop(); </li></ul><ul><li>                cola2.inserta(e); </li></ul><ul><li>            } </li></ul><ul><li>            return cola2; </li></ul><ul><li>        } catch (ColaException e) { </li></ul><ul><li>            System.err.println(&quot;Error en el uso de la Cola: &quot;+e); </li></ul><ul><li>        } catch (PilaException e) { </li></ul><ul><li>            System.err.println(&quot;Error en el uso de la Pila: &quot;+e); </li></ul><ul><li>        } catch (Exception e) { </li></ul><ul><li>            System.err.println(e); </li></ul><ul><li>        } </li></ul><ul><li>        return null; </li></ul><ul><li>    } </li></ul><ul><li>} // fin class ColaUtil </li></ul>
  13. 13. 1.4 Implementaciones del TDA Pila <ul><li>En esta sección mostraremos tres implementaciones alternativas para el TDA Pila: </li></ul><ul><li>Implementación basada en el TDA Lista; consiste en definir una Pila utilizando una lista </li></ul><ul><li>Implementación con vectores; utiliza un array para almacenar los elementos de la Pila </li></ul><ul><li>Implementación con apuntadores con representación con simple enlace </li></ul>
  14. 14. 1.1.1 Implementación basada en el TDA Lista <ul><li>package pilaBasadaLista; </li></ul><ul><li>import pilaException.*; </li></ul><ul><li>import listaException.*; </li></ul><ul><li>import listaSimpleEnlazada.*; </li></ul><ul><li>public class Pila implements pilaInterface.Pila { </li></ul><ul><li>    private Lista lista; </li></ul><ul><li>    public Pila() { </li></ul><ul><li>        lista = new Lista(); </li></ul><ul><li>    } </li></ul><ul><li>    public boolean vacia() { </li></ul><ul><li>        return lista.vacia(); </li></ul><ul><li>    } </li></ul><ul><li>    public Object tope() throws PilaVaciaException { </li></ul><ul><li>        if (vacia()) throw new PilaVaciaException(); </li></ul><ul><li>        try { </li></ul><ul><li>            return lista.recupera(lista.primero()); </li></ul><ul><li>        } catch (ListaException e) { </li></ul><ul><li>            System.err.println(&quot;Error interno de la Pila: &quot;+e); </li></ul><ul><li>            return null; </li></ul><ul><li>        } </li></ul><ul><li>    } </li></ul>
  15. 15. 1.1.1 Implementación basada en el TDA Lista <ul><li>    public void push(Object elemento) { </li></ul><ul><li>        try { </li></ul><ul><li>            if (vacia()) lista.inserta(lista.fin(),elemento); </li></ul><ul><li>else lista.inserta(lista.primero(),elemento); </li></ul><ul><li>        } catch (ListaVaciaException e) { </li></ul><ul><li>            System.err.println(&quot;Error interno de la Pila&quot;); </li></ul><ul><li>        } </li></ul><ul><li>    } </li></ul><ul><li>    public void pop() throws PilaVaciaException{ </li></ul><ul><li>        if (vacia()) throw new PilaVaciaException(); </li></ul><ul><li>        try { </li></ul><ul><li>            lista.suprime(lista.primero()); </li></ul><ul><li>        } catch (ListaException e) { </li></ul><ul><li>            System.err.println(&quot;Error interno de la Pila&quot;); </li></ul><ul><li>        } </li></ul><ul><li>    } </li></ul><ul><li>}  // fin class Pila </li></ul>
  16. 16. 1.1.2 Implementación con vectores <ul><li>    Representación de una pila mediante un vector </li></ul>0 1 a 3 max-3 tope = max-3 a 2 max-2 a 1 max-1
  17. 17. 1.1.2 Implementación con vectores <ul><li>package pilaContigua; </li></ul><ul><li>import pilaException.*; </li></ul><ul><li>public class Pila implements pilaInterface.Pila { </li></ul><ul><li>    private static int max = 100; </li></ul><ul><li>    private Object elementos[]; </li></ul><ul><li>    private int tope; </li></ul><ul><li>    public Pila() { </li></ul><ul><li>        elementos = new Object[max]; </li></ul><ul><li>        tope=max; </li></ul><ul><li>    } </li></ul><ul><li>    public boolean vacia() { </li></ul><ul><li>        return (tope==max); </li></ul><ul><li>    } </li></ul>
  18. 18. 1.1.2 Implementación con vectores <ul><li>    public Object tope() throws PilaVaciaException { </li></ul><ul><li>        if (vacia()) throw new PilaVaciaException(); </li></ul><ul><li>        return elementos[tope]; </li></ul><ul><li>    } </li></ul><ul><li>    public void push(Object elemento) { </li></ul><ul><li>        tope--; </li></ul><ul><li>        elementos[tope]=elemento; </li></ul><ul><li>    } </li></ul><ul><li>    public void pop() throws PilaVaciaException{ </li></ul><ul><li>        if (vacia()) throw new PilaVaciaException(); </li></ul><ul><li>        tope++; </li></ul><ul><li>    } </li></ul><ul><li>}  // fin class Pila </li></ul>
  19. 19. 1.1.3 Implementación con apuntadores <ul><li>package pilaSimpleEnlazada; </li></ul><ul><li>import pilaException.*; </li></ul><ul><li>public class Pila implements pilaInterface.Pila { </li></ul><ul><li>    class Celda { </li></ul><ul><li>        Object elemento; </li></ul><ul><li>        Celda sig; </li></ul><ul><li>    } </li></ul><ul><li>    private Celda pila; </li></ul><ul><li>    public Pila() { </li></ul><ul><li>        pila = null; </li></ul><ul><li>    } </li></ul><ul><li>    public boolean vacia() { </li></ul><ul><li>        return (pila==null); </li></ul><ul><li>    } </li></ul>
  20. 20. 1.1.3 Implementación con apuntadores <ul><li>    public Object tope() throws PilaVaciaException { </li></ul><ul><li>        if (vacia()) throw new PilaVaciaException(); </li></ul><ul><li>        return pila.elemento; </li></ul><ul><li>    } </li></ul><ul><li>    public void push(Object elemento) { </li></ul><ul><li>        Celda aux = new Celda(); </li></ul><ul><li>        aux.elemento = elemento; </li></ul><ul><li>        aux.sig = pila; </li></ul><ul><li>        pila = aux; </li></ul><ul><li>    } </li></ul><ul><li>    public void pop() throws PilaVaciaException{ </li></ul><ul><li>        if (vacia()) throw new PilaVaciaException(); </li></ul><ul><li>        pila = pila.sig; </li></ul><ul><li>    } </li></ul><ul><li>}  // fin class Pila </li></ul>
  21. 21. 1.1.4 Comparación de las implementaciones <ul><li>De nuevo, los criterios que describimos en un capítulo anterior para la comparación de las implementaciones de listas son también válidos para las implementaciones de pilas. </li></ul><ul><li>La elección de una implementación u otra dependerá de los requerimientos de la aplicación en la que se use. </li></ul><ul><li>Es posible obtener representaciones para pilas que permiten operaciones eficientes que se realizan en tiempos de ejecución constantes. </li></ul>

×