Tema 7- Modelo y Aplicación de Pila, Cola y Lista con Punto de Interés Índice general: g 1. Modelo y Aplicación de Lista con Punto de Interés 2. Modelo y Aplicación p de Pila 3. Modelo y Aplicación de Cola Tema 7- Modelo y Aplicación de Pila, Cola y Lista con Punto de Interés Germán Moltó Escuela Técnica Superior de Ingeniería Informática Uni ersidad Politécnica de Valencia Universidad 1 2 Objetivos Conocer diferentes patrones de acceso a datos. Enfatizar la separación entre especificación e implementación en una Estructura de Datos Comprender la importancia de la semántica de las operaciones de un modelo Aprender los modelos de Lista con Punto de Interés, Pila y Cola Resolver problemas utilizando única y exclusivamente los métodos definidos en los modelos 3 Lista Con Punto de Interés Colección homogénea de datos que solo se puede manipular accediendo secuencialmente al dato que ocupa el punto de interés. interés Modelo útil para realizar el acceso secuencial a una colección de elementos. package modelos; public interface ListaConPI<E> { void id insertar(E i t (E x); ) void eliminar(); void inicio(); () void fin(); void siguiente(); E recuperar(); boolean esFin(); boolean esVacia(); } 4 PI • Precondición: Las operaciones eliminar(), siguiente() y recuperar() solo se pueden ejecutar si el P.I. apunta p dentro de la lista (si ( !esFin()). ()) • La operacion fin() situa el PI al final d lla lista, de li t tras ell último úl i elemento. l Lista Con Punto de Interés: insertar Semántica de la operación p insertar en ListaConPI: Lista Con Punto de Interés: eliminar Semántica de la operación p eliminar en ListaConPI: El nuevo dato siempre se inserta antes del que ocupa el Punto de Interés. Se elimina el elemento al que apunta el PI. PI PI PI PI El PI no se ve alterado tras la operación de inserción. Si Sigue apuntando t d all mismo i elemento. l t Tras realizar el borrado, el PI apuntará al siguiente elemento de la colección (efecto secundario de la operación). 5 6 Ejemplo de Uso del Modelo ListaConPI Ejemplo: Lista de la Compra public class TestListaConPI{ public static void main(String args[]){ ListaConPI<String> l = new LEGListaConPI<String>(); l.insertar(new String(“patatas”)); l.insertar(new String(“limones”)); l.insertar( “leche”); 1. ¿Qué resultado mostrará por l.inicio(); pantalla la ejecución del programa? String b = l.recuperar(); 2. ¿No hay que capturar ninguna () l.eliminar(); excepción al llamar a eliminar? System.out.println(b); 3. ¿Por qué no escribimos }} ListaConPI en lugar de 7 LEGListaConPI? Lista no ordenada sin elementos duplicados. Para insertar un nuevo elemento en la lista: Recorrido secuencial ascendente de la lista desde el inicio, para detectar si el nuevo elemento es un duplicado. Si llegamos al final sin encontrarlo, se añade el nuevo producto. Inserción al final, sin permitir elementos duplicados: l.inicio(); esta = false; while ( !l.esFin() && !esta ){ if (l.recuperar().equals(x)) esta = true; else l.siguiente(); } iff (!esta) (! ) ll.insertar(x); i ( ) 8 ¿¿Por qué q utilizamos equals en lugar de compareTo? Ejemplo: Lista de la Compra (Traza) Insertar el producto perejil en la ListaConPI formada por {patatas cerezas leche} {patatas,cerezas,leche} Lista Con Punto de Interés: Inserción al principio sin permitir elementos duplicados principio, Inicialización de la búsqueda (esta = false, l.inicio()): patatas cerezas leche l.inicio(); esta = false; while ( ! l.esFin() && !esta ){ if (l.recuperar().equals(x)) esta = true; else l.siguiente(); } if (!esta){ l inicio(); l.inicio(); l.insertar(x); } Búsqueda (l.siguiente()): patatas cerezas leche patatas cerezas leche Resolución de la Búsqueda (l.insertar(x)): (l insertar(x)): ¿Cual es el resultado de ejecutar l Fi () tras ell proceso?? l.esFin() patatas cerezas leche patatas t t cerezas leche perejil jil 9 10 Ejercicio: Lista con Punto de Interés Recorrido secuencial comprobando p qque el nuevo elemento NO existe, situar el PI al inicio y posterior inserción al final de la colección de elementos. Dada la siguiente g lista con punto p de interés … patatas cerezas leche … sobre b la l que se realiza li la l operación: ió l.insertar(perejil). li t ( jil) Dibuja el estado de la lista y comenta el resultado que se obtendría tras realizar la operación: l.recuperar(). l recuperar() Solución: patatas cerezas perejil leche 11 Ejercicio 2: Lista con Punto de Interés Dada la siguiente g lista con punto p de interés … patatas cerezas leche … sobre la que se realiza la operación: l.eliminar(). Dibuja Dib j ell estado t d d de lla lilista t y comenta t ell resultado lt d que se obtendría tras realizar la operación: l.esFin(). Solución: S l ió • ll.recuperar() () d devolvería l í leche l h puesto que la inserción NO modifica el punto de interés. interés patatas cerezas 12 • l.esFin() l F () d devolvería l í true. Uso del Modelo Lista Con Punto de Interés El modelo de Lista con Punto de Interés se ha usado implícitamente a través de sus implementaciones contigua y enlazada. for (this.inicio(); !this.esFin(); this.siguiente()){ procesar(this.recuperar()); } for (int i = 0; i < this.talla ; i++){ procesar(this.array[i]); } Estructura de Datos: Pila Una Pila es una colección homogénea de datos en la que: 1. ListaConPI El acceso se realiza siguiendo un criterio LIFO (Last In First Out), esto es, accediendo al dato que ocupa el tope de la pila, il es decir, d i ell último últi que se insertó. i tó E Ejemplos l d de Pilas: Pl Array Lista Enlazada Bandejas en un AutoServicio. H Hojas de d papell en la l bandeja b d de d una impresora. Pila de la recursión. for (NodoLEG<E> aux = this.primero; aux != null; aux = aux.siguiente){ procesar(aux.dato); } 13 14 El interfaz Pila Comportamiento del Modelo Pila package modelos; public interface Pila<E> { void apilar(E x); E desapilar(); E tope(); boolean esVacia(); } Pila de Ejemplo: j p 0 tope 5 15 3 7 7 1 1 5 3 7 1 16 apilar(new Integer(0)) tope 5 3 0 Precondición: P di ió La L ejecución j ió d de las l operaciones i tope() () y desapilar() se deben ejecutar únicamente si la Pila no está vacia. vacia Al ir insertando los elementos, se van apilando sobre el t tope de d la l pila. il tope tope desapilar() 5 3 7 1 tope desapilar() 3 7 1 tope Uso de la Interfaz Pila: Análisis Sintáctico de Paréntesis Análisis Sintáctico de Paréntesis Dada una expresión parentizada, diseñar un método Java que indique la correspondencia entre paréntesis abiertos y cerrados, así como los paréntesis sin pareja. Ejemplo 1: (a*(b+c)+d) Análisis de izquierda a derecha donde cada paréntesis cerrado debe corresponder con el último paréntesis abierto. import modelos.*; import lineales.*; Introduzca la expresión parentizada: (a*(b+c)+d) P é Paréntesis abierto b en pos. 3 se cierra en pos. 7 Paréntesis abierto en pos. 0 se cierra en pos. 10 Estrategia seguida: public bli TestParentesis T tP t i { public static void main(String args[]){ Scanner teclado = new Scanner(System.in); System.out.print("Introduzca la expresión parentizada:"); String expresion = teclado.next(); System.out.println(correspondenciaParentesis(expresion)); Ejemplo 2: (a+b)) Introduzca la expresión parentizada: (a+b)) Paréntesis abierto en pos. pos 0 se cierra en pos. pos 4 Sin pareja el paréntesis cerrado en pos. 5 } … 17 18 Análisis Sintáctico de Paréntesis (II) private static String correspondenciaParentesis(String e){ String res = "";; int talla = e.length(); e length(); Pila<Integer> p = new ArrayPila<Integer>(); for ( int i = 0; i < talla; i++ ) { if ( e.charAt(i) h At(i) == ’(’ ) p.apilar(new il ( IInteger(i)); t (i)) else if ( e.charAt(i) == ’)’ ) { if ( !p.esVacia() ){ res += “Paréntesis abierto en pos. "+ " p.desapilar(); res += " se cierra en la pos. "+i+"\n"; } else res += "Sin pareja el paréntesis cerrado de la posicion "+i; } while ( !p.esVacia() p () ) res += "Sin pareja el paréntesis abierto en pos. "+p.desapilar(); return res; • ¿Cuál es el coste temporal } asintótico del método? } 19 Estructura de Datos: Cola Una Cola es una colección homogenea g de elementos en la que: 1. El acceso se realiza siguiendo un criterio FIFO (First In First Out), es decir, el primer elemento que fue insertado es el primero en ser accedido. Ejemplos de Colas: 20 Cola para entrar a la UPV por las mañanas. Cola para renovarse el DNI. Colas de trabajo pendientes de impresión. C l de Cola d tareas a ejecutar j en un sistema i de d computación ió distribuido. El interfaz Cola Comportamiento del Modelo Cola package modelos; public interface Cola<E> { void encolar(E x); E desencolar(); E primero(); boolean esVacia(); } principio principio final Precondición: Los métodos desencolar() y primero(), únicamente deben ser empleados si la cola no está vacía. Al igual que en la Pila y la ListaConPI, ningún método utiliza como parámetro las referencias principio y final (se relega a la fase de implementación). 21 Cola de Ejemplo: j p c 0 5 final 3 principio 5 22 3 7 final 7 1 c.desencolar() () 1 principio 5 c.encolar(new Integer(0)) final 3 7 1 principio i i i 5 3 final 7 1 0