Você está na página 1de 39

Estrutura

de Dados: Pilhas e Filas


Centro de Inform-ca Universidade Federal de Pernambuco Sistemas de Informao Vinicius Cardoso Garcia vcg@cin.ufpe.br

2011 Vinicius Cardoso Garcia

Pilhas
Uma pilha uma coleo de objetos que so inseridos e re-rados de acordo com o princpio que o l(mo que entra o primeiro que sai (LIFO) Pode-se inserir um objeto a qualquer momento, mas somente o objeto inserido recentemente pode ser removido a qualquer momento

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

Pergunta: Onde pilhas so usadas?


Em computao, que situaes vocs lembram de verem pilhas sendo usadas?

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

Tipo Abstrato de Dados: Pilha


As mais simples de todas as estruturas de dados Formalmente, uma pilha S um -po abstrato de dados (TAD) que suporta os mtodos
push(e): insere o objeto e no topo da pilha pop(): re-ra o objeto do topo da pilha e o retorna; ocorre um erro se a pilha es-ver vazia size(): retorna o nmero de elementos na pilha isEmpty(): retorna um booleano indicando se a pilha est vazia top(): retorna o elemento no topo da pilha, sem re-r-lo; ocorre um erro se a pilha es-ver vazia
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

Exemplo: Uma pilha P


P
6 5 4 3 2 9 2 6

A pilha P possui 4 elementos O elemento do topo (S[4]) 9

1 15

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

Insero na pilha P
P
6 5 4 3 2 9 2 6

1 15

A insero em uma pilha feita atravs de uma operao chamada PUSH P = (15, 6, 2, 9) top[P] = 4 Vamos ver como ca a pilha aps duas operaes de insero: PUSH(P, 17) PUSH(P, 3)
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

Inserindo na Pilha: PUSH(P,17)


P
6 5 17 4 3 2 9 2 6

P = (15, 6, 2, 9) PUSH(P, 17) P = (15, 6, 2, 9, 17) top[P] = 5

1 15

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

Inserindo na Pilha: PUSH(P,3)


P
6 3 5 17 4 3 2 9 2 6

P = (15, 6, 2, 9, 17) PUSH(P, 3) P = (15, 6, 2, 9, 17, 3) top[P] = 6

1 15

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

Removendo da Pilha: POP(P)


P
6 5 17 4 3 2 9 2 6

P = (15, 6, 2, 9, 17, 3) POP(P) P = (15, 6, 2, 9, 17) top[P] = 5

1 15

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

Pr-condies para as operaes


PUSH:
A pilha deve possuir espaos disponveis para a insero de um novo item

POP
A pilha no pode estar vazia

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

10

Implementao baseada em arranjos


Um arranjo S de N Algorithm size() elementos mais uma return t + 1 varivel inteira t que fornece o ndice do Algorithm pop() elemento no topo do if isEmpty() then arranjo S. throw EmptyStackException else ndices em Java comeam tt-1 com 0, t = -1 (pilha vazia) return S[t + 1] Quan-dade de elementos :: t + 1
S 0 1 2 t
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

11

Implementao baseada em arranjos


O arranjo que armazena Algorithm push(o) os elementos da pilha if t = S.length - 1 then pode car cheio throw FullStackException else A operao de push vai tt+1 lanar uma nova exceo
FullStackExcep(on
Limitao da implementao baseada em arranjo
0 1 2 t
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

S[t] o

12

Problema
Implementao baseada em arranjo simples e eciente Qual o aspecto nega-vo? Qual seria uma soluo aceitvel?

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

13

Implementando uma Pilha com LSEs


Primeiro passo: onde ser o topo da pilha, na cabea ou na cauda
Inserir e remover elementos constantemente apenas na cabea Varivel de instncia para o nmero corrente de elementos (size)

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

14

Exemplo: Vericando parnteses


Vericao de parnteses e o agrupamento de smbolos aritm-cos Para cada smbolo de abertura deve corresponder um smbolo de fechamento
correto: ( )(( )){([( )])} correto: ((( )(( )){([( )])} incorreto: )(( )){([( )])} incorreto: ({[ ])} incorreto: (
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

15

Vericando parnteses: Algoritmo


Algorithm ParenMatch(X,n): Input: An array X of n tokens, each of which is either a grouping symbol, a variable, an arithmetic operator, or a number Output: true if and only if all the grouping symbols in X match Let S be an empty stack for i=0 to n-1 do if X[i] is an opening grouping symbol then S.push(X[i]) else if X[i] is a closing grouping symbol then if S.isEmpty() then return false {nothing to match with} if S.pop() does not match the type of X[i] then return false {wrong type} if S.isEmpty() then return true {every symbol matched} else return false {some symbols were never matched} Algoritmos e Estrutura de Dados
Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

16

FILAS
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

17

Filas
Coleo de objetos que so inseridos e removidos de acordo com o princpio de que o primeiro que entra o primeiro que sai (FIFO) Pode-se inserir os elementos em qualquer momento, mas somente o elemento que est na la a mais tempo pode ser re-rado em um dado momento

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

18

Tipo abstrato de dados: Fila


Remoo no incio, insero no m Principais operaes
enqueue(o): insere o elemento e no m da la dequeue(): re-ra e retorna o objeto da frente da la; ocorre um erro se a la es-ver vazia size(): reorna o nmero de objetos na la isEmpty(): retorna um booleano indicando se a la est vazia front(): retorna, mas no remove, o objeto na frente da la; ocorre um erro se a la es-ver vazia
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

19

Filas - Exemplo
1 2 3 4 5 6 7 15 8 6 9 8 10 9 11 4 m[F] = 12 12

inicio[F] = 7

A la F possui 5 elementos O elemento do incio (F[7]) o 15 As primeiras operaes de exemplo so:


ENQUEUE(F, 17) ENQUEUE(F, 3) ENQUEUE(F, 5) DEQUEUE()

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

20

Fila Exemplo: ENQUEUE(F, 17)


1 2 3 4 5 6 7 15 8 6 9 8 10 9 11 4 12 17

F
m[F] = 1

inicio[F] = 7

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

21

Fila Exemplo: ENQUEUE(F, 3)


1 2 3 4 5 6 7 15 8 6 9 8 10 9 11 4 12 17

3 m[F] = 2

inicio[F] = 7

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

22

Fila Exemplo: ENQUEUE(F, 5)


1 2 5 m[F] = 3 3 4 5 6 7 15 8 6 9 8 10 9 11 4 12 17

inicio[F] = 7

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

23

Fila Exemplo: DEQUEUE()


1 2 5 m[F] = 3 3 4 5 6 7 8 6 9 8 10 9 11 4 12 17

inicio[F] = 8

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

24

Implementao baseada em arranjos


Usando arranjo de maneira circular
Para evitar mover objetos armazenados em Q
f: ndice para o primeiro elemento r: ndice para prxima posio livre de Q Inicialmente f = r = 0
normal congura-on Q 0 1 2 f wrapped-around congura-on Q 0 1 2 r f
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

25

Usando o mdulo operador


Cada vez que incrementar f ou r
(f +1) mod N (r + 1) mod N

Quando f = r (la cheia), a mesma situao da la vazia


Q no pode ter no mximo N-1 objetos
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

26

Usando o mdulo operador


Uso do mdulo operador
Algorithm size() return (N - f + r) mod N Algorithm isEmpty() return (f = r)
Q 0 1 2 Q 0 1 2 r f
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

27

Usando o mdulo operador


A operao enqueue lana uma exceo se o Algorithm enqueue(o) if size() = N - 1 then arranjo est cheio throw FullQueueException Exceo dependente de else implementao Q[r] o
r (r + 1) mod N
Q 0 1 2 Q 0 1 2 r f
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

28

Usando o mdulo operador


A operao dequeue Algorithm dequeue() lana uma exceo se a if isEmpty() then throw EmptyQueueException la est vazio else Exceo especicada no o Q[f] TAD f (f + 1) mod N
return o
Q 0 1 2 Q 0 1 2 r f
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

29

AXvidades Complementares
Solucionar os exerccios propostos nos prximos slides Desao: O Problema de Josephus Leitura do captulo 10 do Cormen

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

30

Desao: O Problema de Josephus


Batata quente
Grupo de N crianas em crculo passa a batata em volta do crculo Ao toque do sino, a criana que es-ver com a batata na mo, sai do jogo e deixa a batata com a prxima criana Con-nua at restar uma criana Sinto toca aps a batata ter sido passada k vezes, para algum valor xo de k
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

31

Exerccios de Pilha
1. Ilustre o resultado de cada operao na sequncia: PUSH(P, 4), PUSH(P, 3), POP(P), PUSH(P, 8) e POP(P) sobre uma pilha P inicialmente vazia armazenada em um vetor P [1..6] 2. Para a mesma pilha vazia, ilustre as seguintes sequncias:
PUSH(P, 3), POP(P), POP(P), PUSH(P, 4) PUSH(P, 1), POP(P), PUSH(P, 1), PUSH(P, 1), PUSH (P, 1), PUSH(P, 1), PUSH(P, 1), PUSH(P, 1), PUSH(P, 1)
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

32

Exerccios de Pilha
3. Implemente uma pilha na linguagem de programao de sua preferncia e rodem as seguintes conguraes de pilhas:
Ilustre o resultado de cada operao na sequncia: PUSH(P, 4), PUSH(P, 3), POP(P), PUSH(S, 8) e POP(P) sobre uma pilha P inicialmente vazia armazenada em um vetor P[1..6] Para a mesma pilha vazia, ilustre as seguintes sequncias:
PUSH(P, 3), POP(P), POP(P), PUSH(P, 4) PUSH(P, 1), POP(P), PUSH(P, 1), PUSH(P, 1), PUSH(P, 1), PUSH(P, 1), PUSH(P, 1), PUSH(P, 1), PUSH(P, 1)
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

33

Exerccios de Pilha
4. Adicione uma restrio para que a pilha seja criada com uma capacidade mxima (em seu tamanho). Mostre os algoritmos e a implementao modicada. 5. Especique e implemente operaes para:
Retornar o nmero de objetos na pilha Retornar o objeto no topo da pilha, sem remov- lo (deve retornar um erro caso a pilha esteja vazia)
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

34

Exerccios
6. Seja a funo esvazie( ) tal que, recebendo uma pilha como entrada, esvazie a pilha descartando todos os seus elementos. Escreva a funo esvazie( ) 7. Escreva um programa que verique que expresses aritm-cas esto com os parnteses colocados de forma correta. Guarde o resultado numa pilha tambm. Seu programa deve checar expresses para ver se cada "abre parnteses" tem um "fecha parnteses" correspondente. 8. Uma palavra uma palndrome se a seqncia de letras que a forma a mesma seja ela lida da esquerda para a direita ou vice-versa. Exemplos: arara, rairar, hanah. Escreva a funo palndrome que, dada uma palavra, retorne true caso a palavra seja uma palndrome, e false caso contrrio. Use uma pilha para tal.
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

35

Exerccio
9. Implementar um algoritmo para o problema das torres de hanoi
Resumidamente, as regras so:
Movimentar uma s pea de cada vez Uma pea maior no pode car acima de uma menor No permi-do movimentar uma pea que esteja abaixo de outra

Mais detalhes em:


hwp://pt.wikipedia.org/wiki/Torre_de_Hanoi

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

36

Exerccios de Filas
1. Descreva a sada da seguinte sequncia de operaes sobre uma la: 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()

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

37

Exerccios de Filas
2. Implemente uma la na linguagem de programao de sua preferncia e rodem as seguintes conguraes:
Ilustre o resultado de cada operao na sequncia do exerccio anterior

3. Modique os algoritmos de forma que eles detectem problemas de estouro na la (la sem espao para serem inseridos novos elementos) e problemas de tenta-vas de remoo em las vazias
Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

38

Exerccios de Filas
4. Modique os algoritmos de la de forma que os elementos sejam movimentados para a frente da la quando o elemento do incio for removido (a la anda quando um el. desenleirado)

Algoritmos e Estrutura de Dados Estrutura de Dados: Pilhas e Filas 2011 Vinicius Cardoso Garcia

39