Escolar Documentos
Profissional Documentos
Cultura Documentos
Pilhas
Pilha um tipo de lista onde todas as operaes de insero e remoo so feitas na mesma
extremidade (Topo).
O primeiro a entrar o ltimo a sair e o ltimo a entrar o primeiro a sair (LIFO Last-In
First-Out).
Trata-se de uma estrutura dinmica (pode aumentar ou diminuir durante a existncia).
Exemplos Fsicos:
Guardanapo do topo
Entra
Sai
Topo
mola
Um porta-guardanapos
Exemplo de Instrues
Top(P) acessa o elemento localizado no topo da Pilha P.
Pop(P) remove e retorna o elemento posicionado no topo da Pilha P (diminui o tamanho
da pilha).
Push(P, X) acrescenta o elemento X no topo da Pilha P (aumenta o tamanho da pilha).
Pgina 1
Pilhas
Estado da Pilha
P:[ ]
P:[ a ]
P:[ b, a ]
P:[ c, b, a ]
P:[ b, a ]
P:[ a ]
P:[ d, a ]
P:[ e, d, a ]
P:[ e, d, a ]
P:[ d, a ]
P:[ a ]
Resultado
--------------------------------------------------------c
b
----------------------------e
e
d
topo
an - 1
...
a2
a1
base
b
a
c
b
a
Push(P, a)
Push(P, b)
Push(P, c)
Pop(P)
d
a
e
d
a
d
a
Push(P, d)
Push(P, e)
Pop(P)
b
a
a
Pop(P)
Pop(P)
Pop(P)
Pgina 2
Pilhas
Limites da Pilha
No mundo real uma pilha limitada pelo cho e pelo teto.
* No possvel inserir elementos infinitamente.
* No possvel remover elementos infinitamente.
No computador os limites da pilha se refere a quantidade de memria usada para
represent-la.
Operaes Essenciais para uma Pilha
Init: inicializa uma pilha no estado vazia; Init(P)
IsEmpty: verifica se a pilha est vazia; IsEmpty(P)
IsFull: verifica se a pilha est cheia. IsFull(P)
Exemplo em Pascal do uso de Pilhas.
Programa para converter decimal em binrio
program Dec_Bin;
uses Pilhas;
var P: Pilha;
x, n: integer;
begin
writeln (Digite um inteiro decimal positivo: );
readln (n);
Init(P);
{torna pilha vazia}
repeat
x:= n mod 2;
Push (P, x);
n:= n div 2;
until n=0;
{calcula o resto}
{empilha o resto}
(calcula quociente)
{quociente 0, pra}
end.
Pgina 3
Pilhas
program Pilhas;
var
procedure um;
begin
writeln(Um);
dois;
end;
procedure dois;
begin
writeln(Dois);
tres;
end;
procedure tres;
begin
writeln(Trs);
end;
begin
um;
dois;
tres;
end.
23
14
8
23
8
23
23
24
14
24
24
25
Exerccios
1. Mostre a situao da pilha P, inicialmente vazia, aps a execuo de cada uma das
operaes a seguir:
Push (P, a);
Pop (P);
Pop (P);
Pgina 4
Pilhas
1 Resoluo (vertical)
2 Resoluo (horizontal)
b
a
c
b
a
c
c
b
a
c
a
c
c
b
a
Pop (P);
b
a
e
c
a
e
e
c
a
c
c
a
Pop (P);
Pop (P);
c
b
a
e
c
b
a
c
b
a
2. Usando uma pilha, escreva um programa para ler uma frase e imprimi-la de trs
para frente (com as letras invertidas como um espelho).
Pgina 5
Pilhas
program Inverte;
uses Pilhas;
var P: Pilha;
x, n: integer;
f:string;
begin
writeln ('Entre com uma frase: ');
readln (f);
Init(P);
{torna pilha vazia}
for n:=1 to length(f) do
push(P, f[n]);
while not IsEmpty(P) do {pilha vazia, para}
write(pop(P));
end.
3. Escreva uma rotina que usa uma pilha para verificar se uma dada cadeia de
caracteres uo no palndroma. Exemplo: subinoonibus uma palavra
palndroma.
program Palindroma;
uses
Pilhas;
var
E, S: string;
i: integer;
P: Pinha;
begin
writeln(Frase: );
readln(E);
Init(P);
for i:=1 to length(E) do
Push(P,S[i]);
S:= ;
while not IsEmpty(P) do
{cria frase invertida}
S:=S+Pop(P);
if E=S then writeln(A frase palndroma);
else writeln(A frase no palndroma);
end.
Este Exerccio exemplifica a funo bsica de uma pilha: criar funes! Vemos ainda
que a funo IsEmpty(), em conjunto como comando while, ideal para codificar um
looping que esvazia a pilha, e que o operador +, em Pascal, pode ser usado para
anexar um caractere ao final de uma cadeia (ou para concatenar duas cadeias
quaisquer!).
4. Considerando as ilustraes a seguir, mostre a sequncia de operaes Push e Pop
que devem ser realizadas sobre as pilhas X, Y e Z para que, partindo do estado
inicial, possamos chegar ao estado final.
Pgina 6
Pilhas
a)
d
c
b
a
(X)
b
d
a
c
(Y)
(Z)
(X)
estado inicial
(Y)
estado final
1
4
2
8
3
(X)
(Z)
8
4
1
3
2
(Y)
(Z)
(X)
estado inicial
(Y)
(Z)
estado final
b)
Resoluo A
Push(Y, Pop(X))
Push(Z, Pop(X))
Push(Y, Pop(X))
Push(Z, Pop(X))
Push(X, Pop(Y))
Push(Z, Pop(Y))
Push(Z, Pop(X))
Resoluo B
Push(Y, Pop(X))
Push(Y, Pop(X))
Push(Z, Pop(X))
Push(Y, Pop(X))
Push(Z, Pop(X))
Push(X, Pop(Y))
Push(X, Pop(Y))
Push(Z, Pop(Y))
Push(Z, Pop(X))
Push(Z, Pop(X))
routine B
4 call C
5 call D
6 return
routine C
7 call D
8 print C
9 return
routine D
10 print D
11 return
Pgina 7
Pilhas
b)
routine A
1 print A
2 call B
3 return
routine B
4 print B
5 call C
6 return
Resoluo A
P: [ ]
P: [3]
P: [5,3]
P: [8,5,3]
P: [5,3]
P: [3]
P: [6,3]
P: [3]
P: [ ]
routine C
7 print C
8 call B
9 return
Resoluo B
P: []
P: [3]
P: [6,3]
P: [9,6,3]
P: [6,9,6,3]
P: [9,6,9,6,3]
Pgina 8
Pilhas
1 2 3
...
4 5 6
...
MAX
Base
Consideraes:
No necessrio atribuir valores iniciais aos elementos do vetor ao inicializar a
pilha (irrelevante).
Como o vetor possui elementos entre 1..MAX, no pode haver contedo na posio
0.
P.memo armazena valores indefinidos
P: ?
...
1 2 3
5 6 7
...
MAX
P.topo com valor indica que a pilha est vazia, pois no h nenhum
elemento nessa posio (Pilha vazia P:[ ]).
P.topo mantm o ndice do ltimo elemento inserido.
O argumento P, recebido pela rotina Init, passagem por referncia (possibilita que
qualquer pilha seja inicializada, independentemente de seu nome).
b) Limites da Pilha
function IsEmpty(var P:Pilha): boolean;
begin
if P.topo= 0 then IsEmpty:= true
else
IsEmpty:= false;
end;
Pgina 9
Pilhas
Consideraes
Por que usar funo no lugar de procedimento?
Quando a Pilha est vazia?
Quando a Pilha est cheia?
A passagem por referncia dada, mas no obrigatria, uma vez que no existe
a necessidade de se alterar o valor da Pilha. Entretanto, no necessrio criar
uma nova varivel para copiar a pilha na memria (quanto > MAX > Tempo)
c) Inserindo elementos na Pilha.
procedure Push(var P:Pilha; x:Elem);
begin
if not IsFull(P) then
begin
P.topo:= P.topo + 1;
P.memo[P.topo]:= x;
end
else
writeln(Stack Overflow!);
end;
Consideraes:
Existe espao? Se no, ocorre Stack Overflow.
Inserir o novo elemento no topo.
Incrementar o valor do topo.
d
c
Pgina 10
Pilhas
Consideraes:
A Pilha est vazia?
Remover sempre do topo.
Retornar o elemento e decrementaro topo.
Ao tentar retirar um elemento com a Pilha vazia ocorre Stack Underflow.
A remoo apenas lgica.
d
c
b
c
b
c
b
P.memo [ P.topo ] := x
armazena o elemento
(3)
Consideraes:
No altera o estado da Pilha.
Retorna o elemento do topo.
Unit Pilhas
unit Pilhas;
interface
Pgina 11
Pilhas
const
type
max = 50;
Elem = char;
Pilha = record
topo: integer;
memo: array[1..max] of
end;
procedure
function
function
procedure
function
function
Elem;
Init(var P:Pilha);
IsEmpty(var P:Pilha):boolean;
IsFull(var P:Pilha):boolean;
Push(var P:Pilha; x:Elem);
Pop(var P:Pilha):Elem;
Top(var P:Pilha):Elem;
implementation
procedure Init(var P:Pilha);
begin
P.topo: = 0;
end;
function IsEmpty(var P:Pilha):boolean;
begin
if P.topo= 0 then IsEmpty:= true
else
IsEmpty:= false;
end;
function IsFull(var P:Pilha):boolean;
begin
if P.topo= max then
IsFull:= true
else
IsFull:= false;
end;
procedure Push(var P:Pilha; x:Elem);
begin
if not IsFull(P) then
begin
P.topo:= P.topo + 1;
P.memo[P.topo]:= x;
end
else
writeln (Stack Overflow!);
end;
procedure Pop(var P:Pilha):Elem;
begin
if not IsEmpty(P) then
begin
Pop:= P.memo [P.topo];
P.topo:= P.topo - 1;
end
else
writeln (Stack Overflow!);
end;
function Top(var P:Pilha):Elem;
begin
Pgina 12
Pilhas
end.
Exerccios:
1. Uma alternativa para organizar os dados de uma pilha consiste no uso de um vetor
M[0..n], onde M[0] usado para manter o ndice de topo e M[1], M[2], ..., M[n] so
usados para armazenar os elementos contidos na pilha:
a) Que restrio existe ao tipo dos elementos que a pilha poder contm?
R: Como a pilha criada a partir de um vetor, os elementos da pilha devem ser
todos do mesmo tipo (inteiro, real, char ...) salvo quando em tipo possa ser
convertido em outro tipo.
b) Esquematize a representao grfica para a pilha P:[d, c, b, a].
Topo
d
c
b
a
(P)
Base
Pilha da direita
d ... z
x n-3
Pgina 13