Anda di halaman 1dari 51

Estruturas de Dados em Java Pilha e Fila

Crdito: Prof. Gilbert Azevedo Adaptaes: Prof. Jailton Carlos Jailton.paiva@ifrn.edu.br


19/10/2010 1

OBJETIVO DA AULA DE HOJE


Compreender e aplicar os conceitos de Pilha e Fila em Java

19/10/2010

Boxing e Unboxing
Ao inserir um inteiro num ArrayList, executado um boxing Da mesma forma, quando este valor lido, um unboxing necessrio.
ArrayList Lista = new ArrayList(); int i = 1; Lista.Add(i); int j = (int)Lista[0];

Todo esse procedimento gera um overhead, que degrada a performance dos aplicativos

19/10/2010

Pilha
Continer onde objetos so inseridos e retirados de acordo com o princpio:
o ltimo que entra o primeiro que sai LIFO Last In, First Out

19/10/2010

Aplicaes de Pilha
Aplicaes diretas
Histrico de pginas visitadas em um navegador Seqncia de desfazer em um editor de textos Cadeia de chamada de mtodos em um programa

Aplicaes indiretas
Estrutura de dados auxiliares para algoritmos

Pilhas e Filas

Tipo Abstrato de Dados (TAD)


Um TAD uma abstrao de uma estrutura de dados Um TAD especifica:
Dados armazenados Operaes realizadas sobre os dados Condies de erros associadas s operaes

O TAD Pilha armazena objetos genricos

Pilhas e Filas

Pilha - Operaes
Principais
push(object): insere um elemento na pilha object pop(): remove e retorna o ltimo elemento inserido

Auxiliares
object top(): retorna o ltimo elemento inserido sem remov-lo integer size(): retorna o nmero de elementos armazenados boolean isEmpty(): indica se h ou no elementos na pilha

Pilhas e Filas

Pilha de Inteiros
Operao Sada Incio Pilha Fim

push(5)
push(3)

5
5, 3

pop()
push(7)

3 2
7

5
5, 7

size()
pop()

5, 7
5

top()
pop()

5
5

5
-

pop()
isEmpty()

Erro
True
Pilhas e Filas

Pilha - Excees
Ao executar uma operao em um TAD, podemos causar uma condio de erro, que chamamos exceo Excees podem ser levantadas (thrown) por uma operao que no pode ser executada No TAD Pilha, as operaes pop e top no podem ser realizadas se a pilha estiver vazia Executar pop ou top em uma pilha vazia causa a exceo StackEmptyException
Pilhas e Filas 10

Pilha em Java
Por sua importncia, a estrutura de dados Pilha uma classe embutida no pacote java.util A classe java.util.Stack uma estrutura de dados que armazena objetos Java genricos e inclui, entre outros, os mtodos:
push(obj), pop(), peek(), size() e empty()

Contudo, importante, aprender como implementar uma pilha desde o incio

Pilhas e Filas

11

Interface Pilha em Java


public interface Stack {
public int size(); public boolean isEmpty(); public Object top() throws StackEmptyException; public void push(Object o); public Object pop() throws StackEmptyException;

Pilhas e Filas

12

Classe Stack
o Declarando
Stack pilha = new Stack();

o Inserindo elementos
pilha.push(1);
Insero ocorre no topo da pilha

13

19/10/2010

Classe Stack
o Declarando
Stack pilha = new Stack();

o Inserindo elementos
pilha.push(1); pilha.push(2);
2

1
14 19/10/2010

Classe Stack
o Declarando
Stack pilha = new Stack();

o Inserindo elementos
pilha.push(1); pilha.push(2); pilha.push(3);
3

2
1
15 19/10/2010

Classe Stack
o Declarando
Stack pilha = new Stack();

o Inserindo elementos
pilha.push(1); pilha.push(2); pilha.push(3); pilha.push(4);
4

2
1
16 19/10/2010

Classe Stack
o Declarando
Stack pilha = new Stack();

o Removendo elementos
int item = pilha.pop();
4

Lana a exceo StackEmptyException, se a pilha estiver vazia

4
3

Remoo ocorre no topo da pilha

2
1
17 19/10/2010

Classe Stack
o Declarando
Stack pilha = new Stack ();

o Removendo elementos
int item = pilha.pop(); int item = pilha.pop();
3

2
1
18 19/10/2010

Classe Stack
o Declarando
Stack pilha = new Stack();

o Recuperando elementos sem remov-lo da pilha


int item = pilha.top();
2 Lana a exceo StackEmptyException, se a pilha estiver vazia

2
1
19 19/10/2010

Pilha Baseada em Arranjos


Utiliza um arranjo S de objetos com uma capacidade mxima estimada N Usa um nmero inteiro t para indicar o topo da pilha Os elementos so adicionados da esquerda para a direita Lana exceo especfica StackFullException

0 1 2
Pilhas e Filas 20

N-1

Pilha Baseada em Arranjos


Algoritmo size()
retorne t + 1

Algoritmo isEmpty()
retorne (t < 0)

Algoritmo top()
se isEmpty() ento lance StackEmptyException retorne S(t)

Pilhas e Filas

21

Pilha Baseada em Arranjos


Algoritmo push(o)
se size() = N ento lance StackFullException tt+1 S[t] = o

Algoritmo pop()
se isEmpty() ento lance StackEmptyException e S*t+ S[t] = null tt-1 retorne e

Pilhas e Filas

22

Classe Pilha em Java


public class ArrayStack implements Stack {
public static final int MAX = 1000; private int N; private Object [ ] S; private int t = -1; public ArrayStack() { this (MAX); } public ArrayStack(int qtd) { N = qtd; S = new Object [N]; } public int size() { return (t + 1); } public boolean isEmpty() { return (t < 0); }

Pilhas e Filas

23

Classe Pilha em Java


public Object top() throws StackEmptyException { if (isEmpty()) throw new StackEmptyException (Stack empty); return S[t]; } public void push(Object o) throws StackFullException { if (size( ) == N) throw new StackFullException (Stack overflow); S[++t] = o; } public Object pop () throws StackEmptyException { if (isEmpty()) throw new StackEmptyException (Stack empty); Object e = S[t]; S[t--] = null; return e; }

}
Pilhas e Filas 24

Desempenho e Limitaes
Desempenho
Para uma pilha com n elementos: O espao usado O(N), N >= n Cada operao executa em tempo O(1)

Limitaes
O tamanho mximo deve ser definido a priori e no pode ser mudado Colocar um novo elemento numa pilha cheia causa uma exceo especfica da implementao

Pilhas e Filas

25

Pilha Crescente Baseada em Arranjo


Em uma operao push(), quando o arranjo estiver cheio, ao invs de levantar uma exceo, substitumos o arranjo por um maior Crescimento do arranjo
Estratgia incremental: aumentar o arranjo usando uma constante c Estratgia de duplicao: duplicar o tamanho do arranjo

Pilhas e Filas

26

Pilha Crescente Baseada em Arranjo


Algoritmo push(o)
se size() = N ento A novo arranjo para i 0 at N-1 faa A[i] S*i+ SA tt+1 S[t] = o N novo tamanho

Pilhas e Filas

27

Pilhas e a Mquina Virtual Java


Um programa Java em execuo tem uma pilha privada, que usada para manter as variveis locais e outras informaes importantes dos mtodos a medida que so executados Durante a execuo, a JVM mantm uma pilha cujos elementos so descritores dos mtodos em execuo (frames) A pilha Java faz passagem de parmetros por valor aos mtodos

Pilhas e Filas

28

Pilhas e a Mquina Virtual Java


main () { int i =5 . . cool (i); . . cool (int j) { int k=7; . . fool (k); . . } fool (int m) { . }

fool:
m=7 cool: PC = 216 j=5 k=7 main: PC = 14 i=5

14

216

320 }

Pilha Java
Pilhas e Filas 29

Programa em Java

Pilhas e Recurso
Pilhas podem ser usadas para implementar a chamada recursiva de um mtodo
public static long fatorial (long n) { if (n <=1) return 1; else return n*fatorial (n-1);
}

Pilhas e Filas

30

19/10/2010

31

Fila
Continer onde objetos so inseridos e removidos de acordo com o princpio:
o primeiro que entra o primeiro que sai FIFO First In, First Out

ENTRADA

SADA

Pilhas e Filas

32

Aplicaes de Fila
Aplicaes Diretas
Filas de espera (restaurantes, passagens, etc) Acesso a recursos compartilhados

Aplicaes indiretas
Estrutura de dados auxiliares para algoritmos

Pilhas e Filas

33

TAD Fila
O TAD Fila armazena objetos arbitrrios Inseres e remoes seguem o esquema FIFO: inseres so feitas no fim da fila e remoes no incio

Pilhas e Filas

34

Fila - Operaes
Operaes principais:
enqueue(object): insere um elemento no fim da fila object dequeue(): remove e retorna o elemento do incio da fila

Operaes auxiliares:
object front(): retorna o elemento do incio sem remov-lo integer size(): retorna o nmero de elementos armazenados boolean isEmpty(): indica se h elementos na fila
Pilhas e Filas 35

Fila - Excees
Executar dequeue ou front em uma fila vazia causa a exceo QueueEmptyException

Pilhas e Filas

36

Interface Fila em Java


public interface Queue {
public int size(); public boolean isEmpty(); public Object front() throws QueueEmptyException; public void enqueue(Object o); public Object dequeue() throws QueueEmptyException;

Pilhas e Filas

37

Classe Queue
o Declarando
Queue fila= new Queue();

o Inserindo elementos
fila. Enqueue(Joo);
Insero ocorre no fim da fila

Joo
ENTRADA SADA

19/10/2010

38

Classe Queue
o Declarando
Queue fila= new Queue();

o Inserindo elementos
fila. Enqueue(Joo); fila. Enqueue(Jose);

Jos ENTRADA

Joo SADA

19/10/2010

39

Classe Queue
o Declarando
Queue fila = new Queue();

o Inserindo elementos
fila. Enqueue(Joo); fila. Enqueue(Jose); fila. Enqueue(Pedro);

Pedro
ENTRADA

Jos

Joo SADA

19/10/2010

40

Classe Queue
o Declarando
Queue fila= new Queue();

o Removendo elementos
String nome = fila.Dequeue();
Lana a exceo QueueEmptyException, se a fila estiver vazia ENTRADA Remoo ocorre no incio da fila

Pedro

Jos SADA

19/10/2010

41

Classe Queue
o Declarando
Queue fila= new Queue ();

o Removendo elementos
String nome = fila.Dequeue(); String nome = fila.Dequeue();

Pedro
ENTRADA SADA

19/10/2010

42

Fila de Inteiros
Operao Sada Incio Fila Fim

enqueue(5)
enqueue(3)

5
5, 3

dequeue()
enqueue(7)

5 2
3

3
3, 7

size()
dequeue()

3, 7
7

front()
dequeue()

7
7

7
-

dequeue()
isEmpty()

Erro
True
Pilhas e Filas

43

Fila Baseada em Arranjos


Utiliza um arranjo Q de tamanho N de forma circular Duas variveis mantm informaes de incio e fim da fila
f : ndice do elemento do incio (front), inicia em 0 r : ndice da prxima posio livre (rear), inicia em 0 f = r implica em fila vazia

Lana exceo especfica QueueFullException


Configurao normal: f r

0 1 2 Q
Pilhas e Filas

N-1

Configurao reversa: f > r

0 1 2

44

N-1

Fila Baseada em Arranjos


Algoritmo size()
retorne (N f + r) % N

Algoritmo isEmpty()
retorne (f = r)

Algoritmo front()
se isEmpty() ento lanar QueueEmptyException retorne Q(f)

Pilhas e Filas

45

Fila Baseada em Arranjos


Algoritmo enqueue(o)
se size() = N-1 ento lanar QueueFullException Q[r] = o r (r + 1) % N

Algoritmo dequeue()
se isEmpty() ento lanar QueueEmptyException e Q*f+ Q[f] = null f (f + 1) % N retorne e

Pilhas e Filas

46

Desempenho e Limitaes
Desempenho
Para uma fila com n elementos: O espao usado O(N), N >= n Cada operao executa em tempo O(1)

Limitaes
O tamanho mximo deve ser definido a priori e no pode ser mudado Colocar um novo elemento numa fila cheia causa uma exceo especfica da implementao

Pilhas e Filas

47

Exerccios
1. Descreva a sada da seguinte seqncia de operaes sobre uma pilha de inteiros:
push(5), push(3), pop(), push(2), push(8), pop(), pop(), push(9), push(1), pop(), push(7), push(6), pop(), pop(), push(4), pop(), pop()

2. Descreva a sada da seguinte seqncia de operaes sobre uma fila de inteiros:


enqueue(5), enqueue(3), dequeue(), enqueue(2), enqueue(8), dequeue(), dequeue(), enqueue(9), enqueue(1), dequeue(), enqueue(7), enqueue(6), dequeue(), dequeue(), enqueue(4), dequeue(), dequeue()

Pilhas e Filas

48

Exerccios
3. Implemente a interface Stack e a classe ArrayStack em Java. Utilize a classe para criar uma pilha de inteiros e execute a seqncia de operaes do exerccio 1.
Implemente uma classe, baseada na interface Stack, que controle o crescimento de um arranjo utilizado para armazenar os elementos da pilha. O arranjo deve possuir as seguintes caractersticas: iniciar com tamanho unitrio dobrar de tamanho quando sua capacidade de armazenamento esgotar diminuir pela metade quando apenas 25 % de sua capacidade estiver sendo utilizada.

4.

Pilhas e Filas

49

Exerccios
5. Implemente a interface Queue e uma classe baseada neste interface. Utilize a classe para criar uma fila de inteiros e execute a seqncia de operaes do exerccio 2. Implemente uma classe para representar uma fila onde todos os elementos so necessariamente do tipo String.

6.

Pilhas e Filas

50

Referncia Bibliogrfica
Estrutura de Dados e Algoritmos em Java
Michael T. Goodrich Roberto Tamassia

www.datastructures.net

Pilhas e Filas

51

Anda mungkin juga menyukai