Você está na página 1de 14

Curso de Ciência da

Computação

Estruturas de dados
Pilhas (stacks)

alexandre.perin@ifsc.edu.br

Lages (SC).
Pilhas

• Sumário
o Introdução
o Definição
o Operações
o Funcionamento
o Implementação
o Exercícios

2
Pilhas
• Introdução
o É uma estrutura de dados linear, utilizada em diversos
problemas:
▪ Operações para refazer ou desfazer operações aplicações
(editor de texto)

▪ Recursividade: a cada nova chamada, empilha-se o estado da


recursão atual e executa-se a nova chamada recursiva

▪ Implementação de algoritmos de backtracking (busca por força


bruta)

▪ ...

3
Pilhas
• Definição
o Uma pilha ou stack é uma estrutura de dados linear, cujo
acesso se dá através de uma regra
▪ Último que entra é o primeiro que sai: Last In First Out
(LIFO)
▪ Exemplo:
• Todo livro a ser colocado na pilha vai no topo
• Só é possível retirar um livro do topo.

Pilha de livros 4
Pilhas
o Operações
• Há duas principais
o Push( elemento ): empilha um elemento e atualiza o topo

o Pop( ): retorna o elemento retirado e atualiza o topo

• Há outras complementares
o Número de elementos presentes na pilha

o Verificar se a pilha está ou não vazia

o Limpar a pilha

o ...

5
Pilhas
o Funcionamento
• Ex.: push(30)

Topo 30
Topo 10
10
44
30 44
push(30)

Antes Depois

6
Pilhas
o Funcionamento
• Ex.: pop( )

Topo 30

10
Topo 10
44
44

Antes Depois

7
Pilha
o Exemplo de funcionamento de uma pilha implementada
através de alocação estática de memória (vetor)
• Link:
https://www.cs.usfca.edu/~galles/visualization/StackArray.html

8
Pilhas
o Exemplo de funcionamento de uma pilha implementada
através de alocação dinâmica de memória (lista ligada)
• Link:
https://www.cs.usfca.edu/~galles/visualization/StackLL.html

9
Pilhas
o Implementação
• Há duas maneiras:
o Através de memória estática (vetor)
▪ É importante observar e controlar os limites da pilha
(vetor), de maneira a evitar acessos a posições de
memória não alocadas.

o Através de memória dinâmica (lista encadeada ou ligada)


▪ É importante observar e controlar os ponteiros para os
nodos da pilha, nas operações de push e pop.

10
Pilhas
o As pilhas serão implementadas através de alocação
dinâmica de memória
• Para atender à regra LIFO, as operações de push e pop
devem ser realizadas na mesma extremidade da estrutura, ou
no início ou no final
• A implementação das operações de push e pop deve possuir
eficiência computacional igual a O(1)

11
Pilhas
o Push e Pop em pseudocódigo
// considere que as operação de push e pop serão realizadas no início
Método push(Nodo novoNodo)
Início
Se pilha está vazia Então
pilha <- novoNodo
Senão
novoNodo.próximo <- pilha
pilha <- novoNodo
Fimse
Fim

Método Nodo pop()


Início
Se pilha está vazia Então
Escreva "pilha vazia!"
Senão
retornar pilha;
pilha = pilha.próximo
Fimse
Fim. 12
Pilhas
Exercícios
1. Considere a pilha A abaixo, que está desenhada após duas
operações: push(10) e push(20). Execute as operações a seguir na
pilha A e após a execução de cada operação desenhe como a pilha
ficou.
Operações: Push(100), Push(2), Pop, Push(30), Pop, Push(40)

Topo 20
Topo 10 10
A A

2. Implemente uma pilha de inteiros utilizando memória dinâmica,


que possua eficiência computacional igual a O(1) nas operações de
push e pop. 13
Pilhas
• Síntese
o Sua regra estabelece que o último a entrar é o primeiro a sair
(LIFO)
o Suas operações básicas são: push e pop
o Podem ser implementadas

▪ Alocação estática ou por contiguidade (vetor)

▪ Alocação dinâmica de memória (listas encadeadas ou


ligadas)
o Pilhas são estruturas de dados lineares e simples, usadas em
diversos problemas

▪ Por isso, algumas linguagens já dispõem desta estrutura


▪ Já existe a classe Stack em Java 14

Você também pode gostar