Está en la página 1de 8

EDA I

Definicin de pila
EDA I

Pilas

Una pila es una coleccin lineal de elementos en la que slo se pueden aadir y retirar elementos por uno de sus extremos. Se procesa con una estrategia LIFO (Last In First Out)
tercero 1. 2. 3. 4. push primero push segundo push tercero pop segundo primero top

Pilas

EDA I

EDA I

tipo pila(T) (Recurdese: Metodologa de la programacin) usa bool operaciones pvacia: pila(T) apilar: T pila(T) pila(T) cima: pila(T) T desapilar: pila(T) pila(T) es_vacia: pila(T) bool ecuaciones (1) cima(pvacia) = error (2) cima(apilar(x, p)) = x (3) desapilar(pvacia) = error (4) desapilar(apilar(x, p)) = p (5) es_vacia(pvacia) = True (6) es_vacia(apilar(x, p)) = False
Pilas 3

Operaciones en una pila


Operacin
push pop peek isEmpty size

Descripcin
Aade un elemento a la parte superior de la pila Elimina y devuelve un elemento de la parte superior de la pila (supone que la pila no est vaca) Da acceso al elemento situado en la parte superior de la pila (supone que la pila no est vaca) Determina si la pila est vaca Determina el nmero de elementos de la pila

Pilas

EDA I

EDA I

Pila genrica de elementos T


Pila(T) // El identificador T es un parmetro genrico de clase // crea una pila de elementos de clase T vaca crear: Pila(T) // aade un elemento de clase T a la cima de una pila push: Pila(T) T Pila(T) // devuelve y retira el elemento de la cima de una pila // (supone que la pila no est vaca) pop: Pila(T) T Pila(T) // devuelve el elemento de la cima de una pila // (supone que la pila no est vaca) peek: Pila(T) T // true si la pila est vaca y false en el caso contrario isEmpty: Pila(T) boolean // devuelve el nmero de elementos que hay en la pila size: Pila(T) natural

Interfaz del TAD Pila


public interface PilaTAD<T> { //Aade un elemento a la cima de la pila public void push (T element); //Elimina y devuelve el elemento de la cima de la pila //(supone que la pila no est vaca) public T pop (); //Devuelve, sin eliminarlo, el elemento de la cima de la pila //(supone que la pila no est vaca) public T peek (); //Devuelve true si esta pila no contiene ningn elemento, //y false en caso contrario public boolean isEmpty (); //Devuelve el nmero de elementos de la pila public int size(); }

Pilas

Pilas

EDA I

EDA I

Problemas a resolver

Invertir una palabra


algoritmo o m t i r o g l a omtirogla

Apilando segn vamos leyendo


Cada tarea que llega, interrumpe la que se est haciendo y debe ser atendida. Luego debe continuarse con la ltima tarea que se estuviera haciendo. Implementacin con una pila de tareas
Pilas 7 Pilas

construyendo segn vamos desapilando

(Vase Reverser)

EDA I

EDA I

Problema:
Determinar si los delimitadores {, }, [, ], (, ), estn bien emparejados en una cadena de caracteres dada.

Uso de una pila para la solucin


Para la entrada A{B(C[D]E)F}

Pilas

Pilas

10

EDA I

EDA I

Comprobador de delimitadores
Variable de estado String input public void check() { Crear pila theStack del tamao de input para cada ch de input hacer { si ch es '{, '[ o ( entonces theStack.push(ch); (*Apilar ch*) si no si ch es }, ] o ) entonces si ( !theStack.isEmpty() ) (*Pila no vaca*) entonces { chx = theStack.pop(); (*Desapilar*) si (chx y ch no emparejan bien) Comunicar el error y terminar } si no // la pila est vaca prematuramente Comunicar el error y terminar } // fin del para // Todos los caracteres de input se han procesado si ( !theStack.isEmpty() ) (*Pila no vaca*) Comunicar el error } // end check()

Arrays en Java
Los arrays en java son objetos
int[ ] miTabla; miTabla = new int[100]; // define una referencia a un objeto array de enteros // crea un objeto array de tamao 100 y // hace que miTabla lo referencie

El primer ndice de un array es el 0 El atributo length, indica el nmero de posiciones del array Vase EjemArray.java (anlisis de sus fragmentos de bsqueda y eliminacin)

(Vase BracketChecker)
11 Pilas 12

Pilas

Implementacin de Pila con Array (0)


A
0

EDA I

Implementacin de Pila con Array (1)


import pilaTAD.PilaTAD; public class PilaArray<T> implements PilaTAD<T> { private int maxSize; // size of stack array private T[] stackArray; private int top; // top of stack //-------------------------------------------------------------public PilaArray(int alturaMax) // constructor { maxSize = alturaMax; // set array size stackArray = (T[])(new Object[maxSize]); // create array top = -1; // no items yet } //-------------------------------------------------------------public void push(T elemento) // put item on top of stack { stackArray[++top] = elemento; // increment top, insert item } //-------------------------------------------------------------public T pop() // take item from top of stack { return stackArray[top--]; // access item, decrement top }

EDA I

B
1

C
2

D
3 4 5 6 7 8 9

top

stackArray top = 3 maxSize = 10

Pilas

13

Pilas

14

Implementacin de Pila con Array (2)


//-------------------------------------------------------------public T peek() // peek at top of stack { return stackArray[top]; } //-------------------------------------------------------------public boolean isEmpty() // true if stack is empty { return (top == -1); } //-------------------------------------------------------------public int size() //Nmero de elementos que hay en esta pila { return (1+top); } //-------------------------------------------------------------public boolean isFull() // true if stack is full { return (top == maxSize-1); } }

EDA I

EDA I

Diseo de una estructura ligada


Generalmente, una estructura ligada bien diseada constar de la clase de nodos y de una clase con una o ms referencias a nodos distinguidos Un nodo incluir:
Campos de datos y Una o ms referencias de la clase del nodo (la clase de los nodos es auto-referencial )

Todas las operaciones son O(1)


15 Pilas 16

Pilas

EDA I

EDA I

Definicin de un nodo
class Link { public int iData; public double dData; public Link next; }

Definicin de una estructura ligada


class LinkedList { private Link first; // referencia a nodo distinguido

// datos en el nodo // datos en el nodo // siguiente nodo en la estructura

Link Data next

Link Data next

Link Data next }

public LinkedList() { // constructor first = null; } public boolean isEmpty() {.} public void insertFirst(int id, double dd) {.} public Link deleteFirst() {.} public void displayList() {.} public Link find(int key) {.} public Link delete(int key) {.}

LinkedList
Link first Data next Link Data next Link Data next Link Data next null Pilas

Denominamos NODO a un objeto de la estructura ligada (en esta figura hay tres nodos de la clase Link)
Pilas 17

18

EDA I

EDA I

Insertar al principio
Linked List Link Data next Link Data next Link Data next Link Data next null first Linked List

Retirar el primero
Link Link Data next Link Data next Link Data next null

first

Data next

temp Data next newLink public void insertFirst (int id, double dd) { Link newLink = new Link(id, dd); newLink.next = first; first = newLink; } public Link deleteFirst ( ) { Link temp = first; first = first.next; return temp; }

Coste: O(1)
Pilas 19 Pilas

Coste: O(1)
20

EDA I

Imprimir los datos de la estructura


public void displayList() { System.out.print("List (first-->last): "); Link current = first; // start at beginning of list while(current != null) // until end of list, { current.displayLink(); // print data current = current.next; // move to next link } System.out.println(""); }

Implementacin de Pila con estructura ligada (0)

EDA I

first length = 4

D C B A

Coste: O(n)

Vanse LinkList.java y LinkList2.java

Pilas

21

Pilas

22

Implementacin de Pila con estructura ligada (1)


import pilaTAD.PilaTAD; public class PilaLigada<T> implements PilaTAD<T>{ private LinkG<T> first; private int length; public PilaLigada(){ first = null; length = 0; } //Aade un elemento a la cima de la pila public void push (T element){ LinkG<T> newLink = new LinkG<T>(element); newLink.next = first; first = newLink; length++; }

EDA I

Implementacin de Pila con estructura ligada (2)


//Elimina y devuelve el elemento de la cima de la pila public T pop (){ LinkG<T> temp = first; first = first.next; length--; return temp.data; } //Devuelve, sin eliminarlo, el elemento de la cima de la pila public T peek (){ return (first.data); }

EDA I

//Devuelve true si esta pila no contiene ningn elemento, y false en caso contrario public boolean isEmpty (){ return (first==null); } //Devuelve el nmero de elementos de la pila public int size(){ return length; } Todas

} Pilas 23 Pilas

las operaciones son O(1)


24

EDA I

EDA I

Ms ejemplos de uso
Evaluador de expresiones postfijas: Vase seccin 6.2 de [Lewis, Chase]
(3 * 4 (2 + 5)) * 4 / 2 3 4*2 5 + - 4*2 / en notacin infija en notacin postfija

Mtodo evaluador
// Se supone que expr es una expresin postfija bien formada // Devuelve el resultado de evaluar expr public int evaluate (String expr) { while no se haya procesado toda la expr { Tomar siguiente elemento de la expr if elemento es operador { op2 = extraer cima de la pila op1 = extraer cima de la pila resultado = operar (elemento, op1, op2) Poner resultado en la cima de la pila } else Poner elemento en la pila (porque es un valor) //end if }//end while return la cima de la pila }

Pilas

25

Pilas

26

EDA I

EDA I

Busca camino en un laberinto


private int [ ] [ ] laberinto = { {1,1,1,0,0,1,0}, {1,1,0,1,0,1,0}, {0,1,0,1,1,1,1}, {1,1,1,0,1,0,0}, {0,0,1,1,1,0,1}, {1,0,0,0,1,0,1}, {1,1,1,1,1,0,0}, {1,0,0,0,0,1,1} {1,1,1,1,1,1,1} }; laberinto [fila] [columna] == 1 esa casilla es pasillo laberinto [fila] [columna] == 0 esa casilla es pared

Mtodo de recorrido del laberinto


public boolean traverse (){ Poner posicin inicial en la cima de la pila while la posicin no sea la salida y tenga esperanza de poder llegar a la salida { posicin = extraer la cima de la pila Marcar esa posicin como visitada if la posicin es la salida terminar el while else { para cada casilla posible de avance desde posicin: apilar esa casilla /* puede verse como una tarea que queda por hacer: intentar el camino desde esa casilla*/ } }//end while if la posicin es la salida return true else return false }

Pilas

27

Pilas

28

EDA I

Lectura
De [Lewis, Chase 2006]
Captulo 6

Pilas

29