07_estructuraslineales-pilas

78
Estructuras de datos lineales: pilas Felipe Restrepo Calle [email protected] Departamento de Ingeniería de Sistemas e Industrial Facultad de Ingeniería Universidad Nacional de Colombia Sede Bogotá

Upload: johan-parrado

Post on 04-Dec-2015

2 views

Category:

Documents


1 download

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á

• Listas

• Pilas

• Colas

Estructuras de Datos Estructuras lineales 2

Estructuras de datos lineales

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á