Você está na página 1de 38

Pilhas

Gustavo Bastos
Faculdade dos Guararapes
Aula 3 - 2006_2
Revisão

 Introdução
 Conceitos FIFO e LIFO
 Estruturas de Dados
 Conceitos e utilidades
 Tipos de dados abstratos
 Conceitos e utilidades
Características

 Último que entra primeiro que sai


 Last-In First-Out
 É um tipo abstrato de dados e uma
estrutura de dados
 São muito usadas nos computadores
atuais
 Arquitetura dos computadores, sistemas
operacionais, linguagens de programação
Características
 Funciona como um recipiente de objetos com duas operações
básicas
 push e pop
 Push
 Adiciona um objeto no topo da pilha
 Pop
 Remove um objeto do topo da pilha
 Analogia
 Pilha de pratos onde só o topo é visível
 Dois princípios importantes
 LIFO
 O conteúdo da pilha é escondido
Exemplo

Prato
Prato
retirado
retirado
Pop
Novo
Push
prato

Topo da
pilha

Pilha de pratos
Pilha de inteiros

 Qual estrutura de dados usar?


 Depende do objetivo e das características
 Pilhas podem crescer dinamicamente
 Use Listas encadeadas ou alocação
dinâmica
 Conhecimento prévio do tamanho
máximo
 Array
Operações básicas

 empty()
 Verifica se a pilha está vazia. True se
verdade.
 top()
 Examina o topo da pilha
 push(x)
 Coloca o elemento ‘x’ na pilha
 pop()
 Retira o elemento do topo da pilha
Pilha de inteiros estática

 Quantidade definida de elementos


 Estrutura de dados
 Arrays
Inicialização do algoritmo
pilha
Não
N
Definido

tipo pilha : vetor [1..N] de ...


int; Não
int topo  0; Definido
Não
Definido

...

Não
Definido 1

topo
Push
Algoritmo pseudo-código pilha
para push Não
N
O topo é -1 e queremos Definido
inserir o número 13. O que
fazer? ...
nada push(int x) {
se (topo > N) então topo
Não
13
Definido
i+1
escreva(“Pilha cheia!”);
retorne; topo -1 i

topo  topo + 1;
...
pilha[topo]  x;
} 50 1
Top
pilha Não
Perguntar se a pilha está N
vazia para não gerar Definido
erro de acesso!
Algoritmo pseudo-código ...
para top
topo 13 i

-1
int top() {
pilha_vazia? ...
retorne
pilha[topo]; 50 1

}
Empty
pilha
Qual a resposta de empty? False Não
N
Definido

...
Algoritmo pseudo-código
para empty topo 13 i

-1
booleano empty() {
retorne topo < 1; ...

} 50 1
Pop
Perguntar se a pilha está pilha
vazia para não gerar Não
N
erro de acesso! Definido
Algoritmo pseudo-código
para pop
...

topo 13 i
nada pop() {
topo -1 i-1
pilha_vazia?
topo  topo - 1; ...

} 1
50
Exercício de fixação

 Montar um programa em C ou pseudo


código que implemente uma pilha que
recebe os seguintes comandos:
 I inserir elemento (Exemplo: I 5)
 R remover elemento (Exemplo: R)
 T mostrar o topo da pilha (Exemplo: T)
 V diz se a pilha é vazia (Exemplo: V)
Pilha de inteiros dinâmica

 Quantidade indefinida de elementos


 Estrutura de dados
 Listas encadeadas ou alocação dinâmica
 Aqui vamos usar alocação dinâmica
Inicialização do algoritmo
pilha
Não
fim MAX
Definido

tipo pInt : ponteiro para int; ...

pInt p; // Região livre Não


Definido
pInt inicio; // Início da pilha Não
pInt fim; // Final da pilha Definido

p = aloca(MAX); ...

Não
inicio Definido 1

p
Push dinâmico
Algoritmo pseudo-código pilha
para push fim Não
MAX
O topo é -1 e queremos Definido
inserir o número 13. O que
fazer? ...
nada push(int x) {
se (p > fim) então Não
p 13
escreva(“Pilha cheia!”); Definido
retorne; p -1
p  p + 1;
*p  x; ...
}
inicio 50 1
Top dinâmico
pilha Não
Perguntar se a pilha está MAX
fim Definido
vazia para não gerar
erro de acesso!
Algoritmo pseudo-código ...
para top
p 13

-1
int top() {
pilha_vazia? ...
retorne *p; 1
inicio 50
}
Empty dinâmico
pilha
Qual a resposta de empty? False Não
fim MAX
Definido

...
Algoritmo pseudo-código
para empty p 13

-1
booleano empty() {
retorne p < inicio; ...

} inicio 50 1
Pop dinâmico
Perguntar se a pilha está pilha
vazia para não gerar Não
fim MAX
erro de acesso! Definido
Algoritmo pseudo-código
para pop
...

p 13
nada pop() {
p -1
pilha_vazia?
p  p - 1;
...
}
inicio 50 1
Exercício de fixação

 Montar um programa em C ou pseudo


código que implemente uma pilha
dinâmica que recebe os seguintes
comandos:
 I inserir elemento (Exemplo: I 5)
 R remover elemento (Exemplo: R)
 T mostrar o topo da pilha (Exemplo: T)
 V diz se a pilha é vazia (Exemplo: V)
Aplicações

 Nível de arquitetura
 Avaliação de expressões
 Gerenciamento de memória
 Problemas de busca
 Segurança de dados
Nível de Arquitetura

 É uma área na memória computador


 Origem fixa e tamanho variável
 Stack pointer aponta para a
localização mais recente da pilha
Nível de Arquitetura
 Duas operações
 push
 Coloca item na memória e atualiza stack
pointer
 Pop
 Remove item e atualiza stack pointer
Nível arquitetura

 Se uma operação pop passa da


origem
 Stack underflow
 Se uma operação push ultrapassa o
tamanho máximo da pilha
 Stack overflow
Nível de Arquitetura
Avaliação de expressões

 Algumas calculadoras usam notação


Polonesa reversa
 Compiladores usam pilhas
 Sintaxe de expressões, blocos de
programas
 Antes de transformar em código
Avaliação de expressões
 Maioria das linguagens de
programação são livres de contexto
 Máquinas baseadas em pilhas as
traduzem
Avaliação de Expressões

 ((1 + 2) * 4) + 3
 Pode ser escrito
 12+4*3+
 Usando uma pilha podemos resolver a
expressão
 push quando for operando
 pop dois operandos quando for um
operador
 push o resultado
Gerenciamento de
memória
 Muitas linguagens de programação
são orientadas a pilhas
 Operações básicas recebem argumentos
a partir da pilha
 Muitas máquinas virtuais usam pilha
 Máquina virtual Java
Gerenciamento de
memória
 Memória de tempo de execução usa
pilha
 Manter informação de chamadas de
função
 Fazer chamadas a funções recursivas
Problemas de Busca

 Métodos exaustivos e otimizados usam


pilha
 Métodos exaustivos
 Força bruta e backtracking
 Métodos otimizados
 Soluções heurísticas (A*)
 Usam pilha para armazenar os nós
 Nós são notados, mas só são avaliados
depois
Segurança de dados

 Alguns ambientes computacionais


podem ser vulneráveis
 Usam pilhas de modo descuidado
 Algumas linguagens usam a pilha
comum
 Armazenam dados locais e informações de
retorno
 Dados entram e saem da pilha
 Endereço de retorno também está aí
Segurança de dados

 Possíveis erros
 Dados movidos erroneamente
 Dados maiores do que o tamanho da pilha
 Um possível ataque é passar dados muito
grandes
 Pilha pode retornar para uma posição não
desejada
 Variação de buffer overflow
 Fonte de muitas brechas de segurança
Exercícios

 Calcule as seguintes expressões


 44+8*8/8–
 20 10 + 40 – 3 -
 Desenvolver um programa para fazer
uma avaliação de uma notação
polonesa reversa usando pilha
Exercícios
Descreva a saída das seguintes operações sobre uma pilha
inicialmente vazia:
Operação Saída Pilha
push(4)
push(8)
empty()
top()
pop()
push(13)
top()
Resumo

 Conceitos
 LIFO e características
 Aplicações
 Hardware, software, linguagens
 Implementação
 Pilha estática
 Pilha dinâmica
Bibliografia

 Stack
 http://en.wikipedia.org/wiki/Stack_
%28data_structure%29
 Veloso, Paulo e outros. Estruturas de
Dados. 4ed. 1988.
 Van Wyk, Christopher J. Data
structures and C programs. 1988.

Você também pode gostar