Tema 7- Modelo y Aplicación de Pila, Cola y Lista con Punto de

Anuncio
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
Descargar