07_estructuraslineales-pilas
DESCRIPTION
Es la más simple de las estructuras de organización en las que hay un solo jefe que da las directivas y órdenes al resto de los empleados. Existe una responsabilidad directa e inmediata, ya que los subordinados dependen de un solo superior.TRANSCRIPT
Estructuras de datos lineales: pilas
Felipe Restrepo [email protected]
Departamento de Ingeniería de Sistemas e IndustrialFacultad de Ingeniería
Universidad Nacional de ColombiaSede Bogotá
1. ADT Pila
2. Aplicaciones
3. Implementaciones
PilasADT Aplicaciones Implementaciones
Estructuras de Datos Estructuras lineales 3
Pila (Stack)
• Lista de elementos con restricciones.
• Existe una relación de orden entre los elementos.
• El criterio de ordenación se establece en sentido inversoal orden de llegada.
• El último elemento que llegó al conjunto será el primeroen salir del mismo, y así sucesivamente.
• Sólo se tiene acceso a un elemento de la lista en cadamomento: el elemento añadido más recientemente.
Estructuras de Datos Estructuras lineales 4
PilasADT Aplicaciones Implementaciones
Modelo de pila – Listas LIFO
Comportamiento LIFO (Last In First Out)
Estructuras de Datos Estructuras lineales 5
PilasADT Aplicaciones Implementaciones
Operaciones en una pila
Dos operaciones principales:• push (apilar)• pop (desapilar)
Otras operaciones:• top/peek• isEmpty• makeEmpty• print
Estructuras de Datos Estructuras lineales 6
PilasADT Aplicaciones Implementaciones
Errores en una pila
• Realizar pop o top en una pila vacía Error en el ADT
• Cuando se acaba el espacio de almacenamiento cuando estamos realizando un push Limitación en la implementación, no es
un error en el ADT
Estructuras de Datos Estructuras lineales 7
PilasADT Aplicaciones Implementaciones
1. ADT Pila
2. Aplicaciones
3. Implementaciones
PilasADT Aplicaciones Implementaciones
Estructuras de Datos Estructuras lineales 8
Aplicaciones
• Evaluación de recursividad
• Notación postfijo
• Balanceo de paréntesis, llaves, corchetes (análisis sintáctico)
Estructuras de Datos Estructuras lineales 9
PilasADT Aplicaciones Implementaciones
Recursividad
• Usar pila para evaluar la recursividad• Se hace push con los llamados recursivos a un
procedimiento• Cuando llega al(los) caso(s) base, se empieza a hacer
pop y a evaluar
• Ejemplo: factorial de un número entero NN! = N * (N-1)!
1! = 1
Estructuras de Datos Estructuras lineales 10
PilasADT Aplicaciones Implementaciones
Recursividad
Ejemplo: cálculo de 6!
Estructuras de Datos Estructuras lineales 11
PilasADT Aplicaciones Implementaciones
Recursividad
Ejemplo: cálculo de 6!
Estructuras de Datos Estructuras lineales 12
6!
PilasADT Aplicaciones Implementaciones
Recursividad
Ejemplo: cálculo de 6!
Estructuras de Datos Estructuras lineales 13
6! = 6 * 5!
PilasADT Aplicaciones Implementaciones
Recursividad
Ejemplo: cálculo de 6!
Estructuras de Datos Estructuras lineales 14
5! = 5 * 4!
6! = 6 * 5!
PilasADT Aplicaciones Implementaciones
Recursividad
Ejemplo: cálculo de 6!
Estructuras de Datos Estructuras lineales 15
4! = 4 * 3!
6! = 6 * 5!
5! = 5 * 4!
PilasADT Aplicaciones Implementaciones
Recursividad
Ejemplo: cálculo de 6!
Estructuras de Datos Estructuras lineales 16
3! = 3 * 2!
6! = 6 * 5!
5! = 5 * 4!
4! = 4 * 3!
PilasADT Aplicaciones Implementaciones
Recursividad
Ejemplo: cálculo de 6!
Estructuras de Datos Estructuras lineales 17
2! = 2 * 1!
6! = 6 * 5!
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
PilasADT Aplicaciones Implementaciones
Recursividad
Ejemplo: cálculo de 6!
Estructuras de Datos Estructuras lineales 18
1! = 1
6! = 6 * 5!
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
PilasADT Aplicaciones Implementaciones
Recursividad
Ejemplo: cálculo de 6!
Estructuras de Datos Estructuras lineales 19
2! = 2 * 1 = 2
6! = 6 * 5!
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
PilasADT Aplicaciones Implementaciones
Recursividad
Ejemplo: cálculo de 6!
Estructuras de Datos Estructuras lineales 20
3! = 3 * 2 = 6
6! = 6 * 5!
5! = 5 * 4!
4! = 4 * 3!
PilasADT Aplicaciones Implementaciones
Recursividad
Ejemplo: cálculo de 6!
Estructuras de Datos Estructuras lineales 21
4! = 4 * 6 = 24
6! = 6 * 5!
5! = 5 * 4!
PilasADT Aplicaciones Implementaciones
Recursividad
Ejemplo: cálculo de 6!
Estructuras de Datos Estructuras lineales 22
5! = 5 * 24 = 120
6! = 6 * 5!
PilasADT Aplicaciones Implementaciones
Recursividad
Ejemplo: cálculo de 6!
Estructuras de Datos Estructuras lineales 23
6! = 6 * 120 = 720
PilasADT Aplicaciones Implementaciones
Notación postfija (postfix)
La notación postfija ubica el operador después de losoperandos (para evitar ambigüedades).
Ejemplo: 3 + 2 * 10
Si no está clara la precedencia de operadores puede ser ambiguo
3 2 + 10 * ((3 2 +) 10 *) ((3+2) * 10)
3 2 10 * + (3 (2 10 *) +) (3 + (2*10))
Estructuras de Datos Estructuras lineales 24
PilasADT Aplicaciones Implementaciones
Notación postfija (postfix)
• Apilar (push) los símbolos (operandos) a medida que van apareciendo
• Cuando se lea un operador, desapilar (pop) dos operandos• Evaluar la operación y apilar (push)
Ejemplo:
Estructuras de Datos Estructuras lineales 25
PilasADT Aplicaciones Implementaciones
Notación postfija (postfix)
• Apilar (push) los símbolos (operandos) a medida que van apareciendo
• Cuando se lea un operador, desapilar (pop) dos operandos• Evaluar la operación y apilar (push)
Ejemplo:
Estructuras de Datos Estructuras lineales 26
PilasADT Aplicaciones Implementaciones
Notación postfija (postfix)
• Apilar (push) los símbolos (operandos) a medida que van apareciendo
• Cuando se lea un operador, desapilar (pop) dos operandos• Evaluar la operación y apilar (push)
Ejemplo:
Estructuras de Datos Estructuras lineales 27
PilasADT Aplicaciones Implementaciones
Notación postfija (postfix)
• Apilar (push) los símbolos (operandos) a medida que van apareciendo
• Cuando se lea un operador, desapilar (pop) dos operandos• Evaluar la operación y apilar (push)
Ejemplo:
Estructuras de Datos Estructuras lineales 28
PilasADT Aplicaciones Implementaciones
Notación postfija (postfix)
• Apilar (push) los símbolos (operandos) a medida que van apareciendo
• Cuando se lea un operador, desapilar (pop) dos operandos• Evaluar la operación y apilar (push)
Ejemplo:
Estructuras de Datos Estructuras lineales 29
PilasADT Aplicaciones Implementaciones
Notación postfija (postfix)
• Apilar (push) los símbolos (operandos) a medida que van apareciendo
• Cuando se lea un operador, desapilar (pop) dos operandos• Evaluar la operación y apilar (push)
Ejemplo:
Estructuras de Datos Estructuras lineales 30
PilasADT Aplicaciones Implementaciones
Notación postfija (postfix)
• Apilar (push) los símbolos (operandos) a medida que van apareciendo
• Cuando se lea un operador, desapilar (pop) dos operandos• Evaluar la operación y apilar (push)
Ejemplo:
Estructuras de Datos Estructuras lineales 31
PilasADT Aplicaciones Implementaciones
Notación postfija (postfix)
• Apilar (push) los símbolos (operandos) a medida que van apareciendo
• Cuando se lea un operador, desapilar (pop) dos operandos• Evaluar la operación y apilar (push)
Ejemplo:
Estructuras de Datos Estructuras lineales 32
PilasADT Aplicaciones Implementaciones
Notación postfija (postfix)
• Apilar (push) los símbolos (operandos) a medida que van apareciendo
• Cuando se lea un operador, desapilar (pop) dos operandos• Evaluar la operación y apilar (push)
Ejemplo:
Estructuras de Datos Estructuras lineales 33
PilasADT Aplicaciones Implementaciones
Notación postfija (postfix)
• Apilar (push) los símbolos (operandos) a medida que van apareciendo
• Cuando se lea un operador, desapilar (pop) dos operandos• Evaluar la operación y apilar (push)
Ejemplo:
Estructuras de Datos Estructuras lineales 34
PilasADT Aplicaciones Implementaciones
Notación postfija (postfix)
• Apilar (push) los símbolos (operandos) a medida que van apareciendo
• Cuando se lea un operador, desapilar (pop) dos operandos• Evaluar la operación y apilar (push)
Ejemplo:
Estructuras de Datos Estructuras lineales 35
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
• Realizar balanceo de: • paréntesis ()• llaves {}• corchetes []
• Hacer un barrido del código fuente:• Si vemos un símbolo de apertura, lo apilamos (push)• Si vemos un símbolo de cierre, lo desapilamos (pop) y
comparamos con el esperado
Estructuras de Datos Estructuras lineales 36
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 37
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 38
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 39
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 40
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 41
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 42
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 43
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 44
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 45
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 46
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 47
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 48
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 49
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 50
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 51
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 52
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 53
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 54
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 55
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 56
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 57
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 58
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 59
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 60
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 61
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 62
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 63
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 64
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 65
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 66
PilasADT Aplicaciones Implementaciones
Chequeo sintáctico
Estructuras de Datos Estructuras lineales 67
PilasADT Aplicaciones Implementaciones
1. ADT Pila
2. Aplicaciones
3. Implementaciones
PilasADT Aplicaciones Implementaciones
Estructuras de Datos Estructuras lineales 68
Implementaciones
• Java Collections
• Listas enlazadas
• Arreglos
Estructuras de Datos Estructuras lineales 69
PilasADT Aplicaciones Implementaciones
Pila en Java Collections: Stack
Estructuras de Datos Estructuras lineales 70
PilasADT Aplicaciones Implementaciones
Pila en Java Collections: Stack
• Esta clase es considerada como una clase “legado” de versionesanteriores (“legacy class”) y no se utiliza mucho en la actualidad.
• Hereda de la clase Vector y añade 5 métodos para operar comouna pila.
• Una estructura en Java más completa, consistente y eficiente pararealizar operaciones de pila (LIFO) se encuentra en la interfaceDeque (“deck”) y sus implementaciones. Se deben usar éstaspreferiblemente (en lugar de Stack). Ejemplo:
Deque<Integer> stack = new ArrayDeque<Integer>();
Estructuras de Datos Estructuras lineales 71
PilasADT Aplicaciones Implementaciones
Pila en Java Collections: Stack
Estructuras de Datos Estructuras lineales 72
PilasADT Aplicaciones Implementaciones
Pila mediante una lista enlazada
• ¿Tipo de lista enlazada? ¿simple, doble, circular, …? Lista enlazada simple
• ¿Se añade en la primera posición o en la última? Primera: Operaciones en tiempo constante
• Operaciones: push(x)
pop()
top()
Estructuras de Datos Estructuras lineales 73
add(0, x)
remove(0)
get(0)
PilasADT Aplicaciones Implementaciones
Pila mediante un arreglo (alternativa más popular)
• ¿Se añade en la primera posición o en la última? Última. Operaciones en tiempo constante
• Operaciones: push(x)
pop()
top()
Estructuras de Datos Estructuras lineales 74
array[k++]=x
return array[--k]
return array[k-1]
PilasADT Aplicaciones Implementaciones
Algoritmos básicos con pilas
• Escribir el contenido de una pila en pantalla (sin usar estructuras adicionales, ni modificar la pila)
public static <E> void print (MyStack<E> s)
{
E elem;
if (!s.isEmpty ()) {
elem = s.pop ();
System.out.println (elem);
MyStack.<E>print (s);
s.push (elem);
}
}
Estructuras de Datos Estructuras lineales 75
PilasADT Aplicaciones Implementaciones
Algoritmos básicos con pilas
• Escribir el contenido de una pila en pantalla (sin usar estructuras adicionales, ni modificar la pila)
public static void main(String[] args) {
MyStack<Integer> pila = new MyStack<>();
pila.push(1);
pila.push(2);
pila.push(3);
pila.push(4);
pila.pop();
MyStack.<Integer>print(pila);
pila.pop();
MyStack.<Integer>print(pila);
}
Estructuras de Datos Estructuras lineales 76
PilasADT Aplicaciones Implementaciones
Tarea
1. Implementar MyStack:• Usando MyArrayList• Usando MySingleLinkedList
2. Implementar los siguientes métodos:a) Contar el número de elementos de una pila (sin usar estructuras adicionales,
ni modificar la pila). Ayuda: similar al método print.
b) Obtener el duplicado de una pila. Se trata de obtener un duplicado de la pila que se pasa como argumento. En consecuencia, el algoritmo necesitará dos argumentos: la pila origen y la pila destino.
c) Comprobar si un elemento pertenece a una pila. Método que devuelve un valor booleano que determina si un elemento está en la pila o no.
Estructuras de Datos Listas 77
PilasADT Aplicaciones Implementaciones
Estructuras de datos lineales: pilashttps://sites.google.com/a/unal.edu.co/estructuras-de-datos-2015-2/
Felipe Restrepo [email protected]
Departamento de Ingeniería de Sistemas e IndustrialFacultad de Ingeniería
Universidad Nacional de ColombiaSede Bogotá