Você está na página 1de 20

Pilas

Carlos Delgado Kloos Dep. Ingeniera Telemtica Univ. Carlos III de Madrid
cdk@it.uc3m.es Java: Pilas / 1

Ejemplo

cdk@it.uc3m.es

Java: Pilas /

Ejemplo

cdk@it.uc3m.es

Java: Pilas /

Ejemplo

cdk@it.uc3m.es

Java: Pilas /

Caractersticas
Estructura lineal Acceso de insercin y eliminacin por un solo extremo

cdk@it.uc3m.es

Java: Pilas /

Mtodos principales
Meter por un extremo: push(x) Sacar por el mismo extremo: pop()

cdk@it.uc3m.es

Java: Pilas /

Ejemplo: Comprobar parntesis


Bien:
() (()(()))

Mal:
)( (() ())

Reglas:
Bsico: Secuenciacin: ()() Anidamiento: (())
cdk@it.uc3m.es Java: Pilas / 7

Ejemplo: Comprobar parntesis


Reglas:
Cada vez que nos encontremos ( lo metemos en la pila. Cada vez que nos encontremos ) sacamos el ( superior de la pila. La cadena de parntesis es correcta, si la pila est vaca al acabar de recorrer toda la cadena.
cdk@it.uc3m.es Java: Pilas / 8

Ejemplo: comprobar (()(()())())

(()(()())())

cdk@it.uc3m.es

Java: Pilas /

Ejemplo: comprobar (()(()())())

(()(()())()) (

cdk@it.uc3m.es

Java: Pilas /

10

Ejemplo: comprobar (()(()())())

(()(()())()) ( (

cdk@it.uc3m.es

Java: Pilas /

11

Ejemplo: comprobar (()(()())())

(()(()())()) (

cdk@it.uc3m.es

Java: Pilas /

12

Ejemplo: comprobar (()(()())())

(()(()())()) ( (

cdk@it.uc3m.es

Java: Pilas /

13

Ejemplo: comprobar (()(()())())

(()(()())()) ( ( (

cdk@it.uc3m.es

Java: Pilas /

14

Ejemplo: comprobar (()(()())())

(()(()())()) ( (

cdk@it.uc3m.es

Java: Pilas /

15

Ejemplo: comprobar (()(()())())

(()(()())()) ( ( (

cdk@it.uc3m.es

Java: Pilas /

16

Ejemplo: comprobar (()(()())())

(()(()())()) ( (

cdk@it.uc3m.es

Java: Pilas /

17

Ejemplo: comprobar (()(()())())

(()(()())()) (

cdk@it.uc3m.es

Java: Pilas /

18

Ejemplo: comprobar (()(()())())

(()(()())()) ( (

cdk@it.uc3m.es

Java: Pilas /

19

Ejemplo: comprobar (()(()())())

(()(()())()) (

cdk@it.uc3m.es

Java: Pilas /

20

Ejemplo: comprobar (()(()())())


Correcto: Hemos recorrido toda la cadena y la pila est vaca

(()(()())())

cdk@it.uc3m.es

Java: Pilas /

21

Ejemplo: comprobar ([]{()<>}())


Correcto: Hemos recorrido toda la cadena y la pila est vaca

([]{()<>}())

cdk@it.uc3m.es

Java: Pilas /

22

Ejemplo: HTML
<b><i>hola</b></i>
([)] Correcto con HTML 1.0-4.0 Incorrecto con XHTML

<b><i>hola</i></b>
([]) Correcto con HTML 1.0-4.0 Correcto con XHTML
cdk@it.uc3m.es Java: Pilas / 23

Interfaz para pilas


public interface Stack { public int size(); public boolean isEmpty(); public void push(Object o); public Object pop() throws StackEmptyException; public Object top() throws StackEmptyException; }
cdk@it.uc3m.es Java: Pilas / 24

Un interfaz y varias implementaciones


Stack

ArrayStack

LinkedStack

cdk@it.uc3m.es

Java: Pilas /

25

Implementacin basada en arrays


S
top top top top top top 1
0

2 3
1 2

4
3

5
4 5 N-1

cdk@it.uc3m.es

Java: Pilas /

26

Implementacin basada en arrays


public class ArrayStack implements Stack { public static final int CAP=1000; private int capacity; private Object S[]; private int top=-1; public ArrayStack(){this(CAP);} public ArrayStack(int cap){ capacity=cap; S=new Object[capacity];}

cdk@it.uc3m.es

Java: Pilas /

27

Implementacin basada en arrays


public int size() {return (top+1);} public boolean isEmpty() {return (top<0);} public Object top() throws StackEmptyException { if (isEmpty()) throw new StackEmptyException("vacio"); return S[top];}

cdk@it.uc3m.es

Java: Pilas /

28

Implementacin basada en arrays


public void push(Object o) throws StackFullException { if (size()==capacity) throw new StackFullException("lleno"); S[++top]=o;} public Object pop() throws StackEmptyException { Object el; if (isEmpty()) throw new StackEmptyException("vacio"); el=S[top]; S[top--]=null; return el;} }

cdk@it.uc3m.es

Java: Pilas /

29

Implementacin basada en listas encadenadas


top

Madrid

Miami

Mnich

cdk@it.uc3m.es

Java: Pilas /

30

Implementacin basada en listas


class Node { private Object elem; private Node next; public Node(Object e, Node n) { elem=e; next=n;} void setElem(Object e) {elem=e;} void setNext(Node n) {next=n;} Object getElem() {return elem;} Node getNext() {return next;} }
cdk@it.uc3m.es Java: Pilas / 31

Implementacin basada en listas


public class LinkedStack implements Stack { private Node top; private int size; public LinkedStack() {top=null; size=0;} public int size() {return size;} public boolean isEmpty() { return(top==null);}
cdk@it.uc3m.es Java: Pilas / 32

Insercin (push)
top

Madrid

Miami

Mnich

Mosc

cdk@it.uc3m.es

Java: Pilas /

33

Implementacin basada en listas


public void push(Object e) { Node n=new Node(e, top); top=n; size++; }

cdk@it.uc3m.es

Java: Pilas /

34

Implementacin basada en listas


public Object top() throws StackEmptyException { if (isEmpty()) throw new StackEmptyException("vacia"); return top.getElem(); }

cdk@it.uc3m.es

Java: Pilas /

35

Borrado (pop)

top

Mosc

Madrid

Miami

Mnich

cdk@it.uc3m.es

Java: Pilas /

36

Implementacin basada en listas


public Object pop() throws StackEmptyException { Object temp; if (isEmpty()) throw new StackEmptyException("vacia"); temp=top.getElem(); top=top.getNext(); size--; return temp; }
cdk@it.uc3m.es Java: Pilas / 37

Pilas y recursin
public static long fac (int n) {if (n<=1) return 1; else return n*fac(n-1); }

cdk@it.uc3m.es

Java: Pilas /

38

Ejecucin
fac(4) 4*fac(3) 4*(3*fac(2)) 4*(3*(2*fac(1))) 4*(3*(2*1))) 4*(3*2) 4*6 24
cdk@it.uc3m.es

2* 3* 4*

Java: Pilas /

39

Você também pode gostar