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
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()
Pilhas e Filas
11
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
4
3
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();
2
1
19 19/10/2010
0 1 2
Pilhas e Filas 20
N-1
Algoritmo isEmpty()
retorne (t < 0)
Algoritmo top()
se isEmpty() ento lance StackEmptyException retorne S(t)
Pilhas e Filas
21
Algoritmo pop()
se isEmpty() ento lance StackEmptyException e S*t+ S[t] = null tt-1 retorne e
Pilhas e Filas
22
Pilhas e Filas
23
}
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
Pilhas e Filas
26
Pilhas e Filas
27
Pilhas e Filas
28
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
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
0 1 2 Q
Pilhas e Filas
N-1
0 1 2
44
N-1
Algoritmo isEmpty()
retorne (f = r)
Algoritmo front()
se isEmpty() ento lanar QueueEmptyException retorne Q(f)
Pilhas e Filas
45
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()
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