Estructuras Lineales Java
Estructuras Lineales Java
Estructuras Lineales Java
E.S.I. Informtica
3. TAD cola
3.1. Especificacin 3.2. Implementacin Mediante arrays circulares Mediante listas enlazadas 3.3. Variantes del TAD Cola 3.4. Aplicaciones del TAD cola
4. Secuencias
4.1. Secuencias por posicin: Listas Especificacin Implementacin 4.2. Iteradores
Departamento de Informtica
Reyes Pavn
E.S.I. Informtica
Bibliografa
Bsica
Goodrich M. y Tamassia R., Data structures and Algorithms in JAVA 4 ed. John Wiley & Sons Inc. , 2006 Pgs.187-203, 204-210, 222-228, 231-241, 242-248 Lewis, J. y Chase J. Estructuras de datos con Java. Diseo de estructuras y algoritmos. 2 ed. Pearson. Addisson Wesley. 2006 Pgs. 152-161, 166-174, 180-182, 193-205 Weiss, Mark Allen, Estructuras de datos en Java: compatible con JAVA 2, Addisson Wesley. 2000. Pgs.139-146, 395-410, 415-427 Liskov, B. y J. Guttag, Program Development in Java: Abstraction, Specification, and Object-Oriented Design, Addison-Wesley, 2001. Pgs. 125-137
Complementaria
Goodrich M. y Tamassia R., Data structures and Algorithms in JAVA 2 ed. John Wiley & Sons Inc. , 2001. Pgs.166-173, 213-216, 249-259 Lewis, J. y Chase J. Estructuras de datos con Java. Diseo de estructuras y algoritmos. 2 ed. Pearson. Addisson Wesley. 2006 Pgs. 161-166, 182-192, 212-240, 246-261
Departamento de Informtica
Reyes Pavn
E.S.I. Informtica
Departamento de Informtica
Reyes Pavn
E.S.I. Informtica
2. TAD PILA
Una pila es un contenedor de objetos que son insertados y eliminados de acuerdo con el principio de que el ltimo en entrar es el primero en salir.
Entrar
Aplicaciones:
deshacer que cancela las operaciones de edicin recientes y restablece el estado anterior del documento.
Departamento de Informtica
Reyes Pavn
E.S.I. Informtica
2.1. Especificacin
Especificacin cuasi-formal:
public class Pila <E> { // caractersticas: // Es una secuencia de elementos donde el ltimo en entrar es el primero // en ser eliminado // Los objetos son modificables. // constructores public Pila <E> ( ) // Produce: una pila vaca //mtodos public int tamao() // Produce: devuelve el nmero de elementos de la pila public boolean esVacio() // Produce: cierto si la pila est vaca. Falso en otro caso public E top() throws PilaVaciaExcepcion // Produce: si la pila est vaca lanza la excepcin // PilaVaciaExcepcion, sino devuelve el objeto ms // recientemente introducido public E pop() throws PilaVaciaExcepcion // Modifica: this // Produce: si la pila est vaca lanza la excepcin // PilaVaciaExcepcion, sino devuelve el objeto ms // recientemente introducido y lo suprime de la pila public void push (E elemento) // Modifica: this // Produce: aade un objeto a la pila, pasando a ser el nuevo tope }
Departamento de Informtica
Reyes Pavn
E.S.I. Informtica
2.2. Implementacin
Dos pasos:
Definicin de una interfaz que describa los nombres de los mtodos que soporta el TAD y cmo tienen que ser declarados y usados.
public interface Pila<E>{ public int tamao(); public boolean esVacio(); public E top() throws PilaVaciaExcepcion; public void push (E elemento); public E pop() throws PilaVaciaExcepcion; } public class PilaVaciaExcepcion extends RuntimeException{ ... }
Proporcionar una clase concreta que implemente los mtodos de la interfaz asociada con el TAD.
Tope de la pila
Mediante arrays
elementos
a1
0
a2
1
a3
2
a4
3
...
at
tope N-1
Problema: pila llena Solucin: mtodo privado duplicarPila() que lleve a cabo una expansin dinmica del vector un nuevo tipo de excepcin, PilaLlenaExcepcion
public class ArrayPila<E> implements Pila<E>{ public static final int CAPACIDAD_POR_DEFECTO=10; private E[]elementos; private int tope;
Departamento de Informtica
Reyes Pavn
E.S.I. Informtica
public ArrayPila(int capacidad){ elementos=(E[])new Object [capacidad]; tope=-1; } public ArrayPila (){ this(CAPACIDAD_POR_DEFECTO); } public int tamao(){ return (tope+1); } public boolean esVacio(){ return tope==-1; } public E top()throws PilaVaciaExcepcion{ if (esVacio()) throw new PilaVaciaExcepcion("top: Pila vacia"); return elementos[tope]; } public void push (E elemento){ if (tope==elementos.length-1) duplicarPila(); elementos[++tope]=elemento; } public E pop()throws PilaVaciaExcepcion{ E elemento; if (esVacio()) throw new PilaVaciaExcepcion("pop: Pila vaca"); elemento=elementos[tope]; elementos[tope--]=null; return elemento; } private void duplicarPila(){ E[] nuevaPila; nuevaPila=(E[])new Object[elementos.length*2]; for (int i=0;i<elementos.length;i++) nuevaPila[i]=elementos[i]; elementos=nuevaPila; } }
Implementacin alternativa usando la clase Vector<E> Ventajas: implementacin simple y eficiente Desventaja: lmite superior en el tamao del array
Departamento de Informtica
Reyes Pavn
E.S.I. Informtica
Tope de la pila
Se define una clase genrica Nodo, la cual especifica el formato de los objetos asociados a los nodos de la pila
public class Nodo<E> { private E elemento; //referencia al elemento del nodo private Nodo<E> sig; //referencia al siguiente nodo de la lista //constructor public Nodo(){ //Produce: crea un nodo con valor null en sus referencias al // elemento y al siguiente nodo this(null,null); } public Nodo(E e, Nodo<E> n){ // Produce: un objeto Nodo con el elemento y siguiente nodo // que se le pasa como parmetro elemento=e; sig=n; } //mtodos public void setElemento(E e){ // Modifica: this // Produce: modifica el atributo elemento de this elemento = e; } public void setSig(Nodo<E> n){ // Modifica: this // Produce: modifica el atributo sig de this sig = n; } public E getElemento(){ // Produce: devuelve el atributo elemento de this return elemento; }
Departamento de Informtica
Reyes Pavn
E.S.I. Informtica
public Nodo<E> getSig(){ // Produce: devuelve el atributo sig de this return sig; } }
Se define una clase genrica EnlazadaPila que mantiene una referencia al primer nodo de la lista.
public class EnlazadaPila<E> implements Pila<E> { private Nodo<E> tope; private int contador; public EnlazadaPila(){ tope=null; contador=0; } public int tamao(){ return contador; } public boolean esVacio(){ return tope==null; } public E top() throws PilaVaciaExcepcion{ if (esVacio()) throw new PilaVaciaExcepcion("top: Pila Vacia"); return tope.getElemento(); } public void push (E e){ Nodo<E> n=new Nodo<E>(e,tope); tope=n; contador++; } public E pop() throws PilaVaciaExcepcion{ if (esVacio()) throw new PilaVaciaExcepcion("pop: Pila Vacia"); E e=tope.getElemento(); tope=tope.getSig(); contador--; return e; } }
Departamento de Informtica
Reyes Pavn
E.S.I. Informtica
Llamadas a subprogramas
Recursin.
2.3.1. Tratamiento de expresiones aritmticas Cul es el resultado de 4*5 + 6*7? 20 + 42 = 62, correcto 20 + 6 = 26 * 7 = 182, error A qu se debe el error? Se han utilizado mal las precedencias. Cmo puede solucionarse?
Tipos de notacin :
A op B A B op op A B
Departamento de Informtica
10
Reyes Pavn
E.S.I. Informtica
Usando una pila este proceso puede realizarse de la siguiente forma: 1. Leyendo uno por uno los elementos de la entrada y si a) es un operando, se manda a la salida; b) es un ( push (P, ( ) c) es un ) hacer pop (P) hasta que se encuentre ( d) es un operador op, entonces d.1) sacar de la pila, pop (P), los operadores con prioridad mayor o igual a op. Las prioridades de menor a mayor seran: ( +,*, / d.2) push (P, op) 2. Cuando se llega al final de la entrada, se vaca la pila P sobre la salida. Ejemplo: Entrada = a + b * c + (d * e + f) * g En el siguiente ejemplo el tope de la pila es el elemento ms a la derecha
Entrada a + b * Operacin a la salida Push a la salida + < * push * + + + * Pila Salida a a ab ab
Departamento de Informtica
11
Reyes Pavn
E.S.I. Informtica
c +
a la salida mientras precedencia tope >= precedencia operador hacer pop; push +
+ * +
abc abc*+
( d * e +
push ( a la salida Push a la salida mientras precedencia tope >= precedencia operador hacer pop; push +
+ ( + ( + ( * + ( * + ( +
f ) * g
+ ( + + + * + *
Departamento de Informtica
12
Reyes Pavn
E.S.I. Informtica
Evaluacin de la notacin postfija mediante una pila. Cmo usar una pila? 1. Se lee la entrada, elemento a elemento, x:
Si es un operando se mete en la pila: push(P, x) Si es un operador se sacan los operandos, se realiza la operacin y se guarda el resultado en la pila:
pop (P); pop(P); evaluar (operador, op1, op2, res); push(P, res) 2. Al terminar de leer la entrada, en el tope de la pila P debe quedar el resultado de la operacin Ejemplo: 4 5 * 6 7 * + Entrada 4 Accin Pila 4 45
Push() Push() Evaluar + push() Push() Push() Evaluar + push() Evaluar + push()
5
* 6 7 * +
20 20 6
20 6 7 20 42 62
Departamento de Informtica
13
Reyes Pavn