MC202 - Estruturas de Dadosfrancesquini/mc202/files/aula04.pdf · Aula 04 - 14 de março de 2017....
Transcript of MC202 - Estruturas de Dadosfrancesquini/mc202/files/aula04.pdf · Aula 04 - 14 de março de 2017....
MC202 - Estruturas de DadosEmilio Francesquini
Instituto de Computação - UNICAMP
Aula 04 - 14 de março de 2017
Disclaimer
• Esses slides foram preparados para um curso de Estrutura deDados ministrado na UNICAMP
• Este material pode ser usado livremente desde que sejammantidos os créditos dos autores e da instituição.
• Muitos dos exemplos apresentados foram retirados demateriais preparados pelos Profs. T. Kowaltowski e O. Lee daUNICAMP assim como do Prof. P. Feofiloff do IME-USP
Pilhas
MC202 - Aula 4 Pilhas 3 / 37
Pilhas - Intuição
• Todos tem uma noção intuitiva do que é uma pilha (=stack)• É prático
• Verificar qual é o item no topo da pilha• Colocar algo (=empilhar) no topo (=top) da pilha• Tirar algo (=desempilhar) do topo da pilha
• Um ou mais elementos
• É mais trabalhoso• Retirar um (ou alguns) itens intermediários• Verificar o conteúdo de um elemento que não está no topo
MC202 - Aula 4 Pilhas 4 / 37
Pilhas
• Pilhas são uma manifestação do que chamamos de tipoabstrato de dados (=Abstract Data Type)
• Nem falamos sobre a implementação, mas já sabemos quepara ser util ela terá as seguintes operações
• vazio (=empty) – Verifica se a pilha está vazia• empilhar (=push) – Empilha um elemento• desempilhar (=pop) – Desempilha um elemento• consultar (=peek) – Olha o primeiro elemento da lista sem
retirá-lo• Tradicionalmente os nomes em inglês das operações
costumam ser mais utilizados• Mas por alguma razão o nome stack não é tão utilizado
assim...
MC202 - Aula 4 Pilhas 5 / 37
Pilhas - Operação
• As seguintes frases resumem o comportamento de umapilha:
• o elemento removido da pilha é o que está lá há menostempo
• o primeiro elemento inserido na pilha é o último a serremovido.
Esta politica de operação é chamada de LIFO (Last-In-First-Out)Quem entrou antes, saí depois...
MC202 - Aula 4 Pilhas 6 / 37
Pilhas - Resumindo
• Topo (top): é o lado em que as operações são feitas;• empilhar (push) = inserir no topo;• desempilhar (pop) = remover do topo.
MC202 - Aula 4 Pilhas 7 / 37
Pilhas - Implementação
• Veremos duas implementações de pilhas• Estáticas – Utilizando vetores• Dinâmicas – Utilizando listas ligadas
MC202 - Aula 4 Pilhas 8 / 37
Pilhas Estáticas
[4]topo [3]
30 [2]20 [1]10 [0]
• Neste caso o tamanho máximo da pilha é n = 5• topo sempre aponta para o próximo elemento vazio
• A pilha está cheia se o topo = n• A pilha está vazia se o topo = 0
MC202 - Aula 4 Pilhas 9 / 37
Pilhas Estáticas - Exemplo
push(10) [4] n = 5push(20) [3] topo = 0push(30) [2]pop [1] topo == 0push(40) [0] ← Pilha vazia!push(50)poppush(100)push(200)
MC202 - Aula 4 Pilhas 10 / 37
Pilhas Estáticas - Exemplo
push(10) [4] topo = 1push(20) [3] n = 5push(30) [2]pop [1] ←push(40) 10 [0]push(50)poppush(100)push(200)
MC202 - Aula 4 Pilhas 11 / 37
Pilhas Estáticas - Exemplo
push(10) [4] topo = 2push(20) [3] n = 5push(30) [2] ←pop 20 [1]push(40) 10 [0]push(50)poppush(100)push(200)
MC202 - Aula 4 Pilhas 12 / 37
Pilhas Estáticas - Exemplo
push(10) [4] topo = 3push(20) [3] ← n = 5push(30) 30 [2]pop 20 [1]push(40) 10 [0]push(50)poppush(100)push(200)
MC202 - Aula 4 Pilhas 13 / 37
Pilhas Estáticas - Exemplo
push(10) [4] topo = 2push(20) [3] n = 5push(30) [2] ←pop 20 [1]push(40) 10 [0]push(50)poppush(100)push(200)
MC202 - Aula 4 Pilhas 14 / 37
Pilhas Estáticas - Exemplo
push(10) [4] topo = 3push(20) [3] ← n = 5push(30) 40 [2]pop 20 [1]push(40) 10 [0]push(50)poppush(100)push(200)
MC202 - Aula 4 Pilhas 15 / 37
Pilhas Estáticas - Exemplo
push(10) [4] ← topo = 4push(20) 50 [3] n = 5push(30) 40 [2]pop 20 [1]push(40) 10 [0]push(50)poppush(100)push(200)
MC202 - Aula 4 Pilhas 16 / 37
Pilhas Estáticas - Exemplo
push(10) [4] topo = 3push(20) [3] ← n = 5push(30) 40 [2]pop 20 [1]push(40) 10 [0]push(50)poppush(100)push(200)
MC202 - Aula 4 Pilhas 17 / 37
Pilhas Estáticas - Exemplo
push(10) [4] ← topo = 4push(20) 100 [3] n = 5push(30) 40 [2]pop 20 [1]push(40) 10 [0]push(50)poppush(100)push(200)
MC202 - Aula 4 Pilhas 18 / 37
Pilhas Estáticas - Exemplo
←push(10) 200 [4] topo = 5push(20) 100 [3] n = 5push(30) 40 [2]pop 20 [1] topo == 5push(40) 10 [0] Pilha Cheia!push(50)poppush(100)push(200)
MC202 - Aula 4 Pilhas 19 / 37
Manipulando Pilhas Estáticas
• Empilhar (push) – pilha[topo++] = x;• Consultar (peek) – x = pilha[topo - 1];• Desempilhar (pop) – x = pilha[--topo];• Vazio (empty) – topo == 0• Cheio (full) – topo == n
E se em algum momento da execução topo > n?
MC202 - Aula 4 Pilhas 20 / 37
Manipulando Pilhas Estáticas
• Empilhar (push) – pilha[topo++] = x;• Consultar (peek) – x = pilha[topo - 1];• Desempilhar (pop) – x = pilha[--topo];• Vazio (empty) – topo == 0• Cheio (full) – topo == n
E se em algum momento da execução topo > n?BUG!
MC202 - Aula 4 Pilhas 20 / 37
Mão na massa!
Let’s code!
MC202 - Aula 4 Pilhas 21 / 37
Pilhas dinâmicas
• Ao contrário das pilhas estáticas, as pilhas dinâmicas nãonecessariamente possuem um tamanho pré-definido
• A implementação é feita com listas ligadas
MC202 - Aula 4 Pilhas 22 / 37
Pilhas dinâmicas - Exemplo
push(10)push(20)push(30)poppush(40)push(50)poppush(100)push(200)
X NULL
MC202 - Aula 4 Pilhas 23 / 37
Pilhas dinâmicas - Exemplo
push(10)push(20)push(30)poppush(40)push(50)poppush(100)push(200)
X 10 NULL
MC202 - Aula 4 Pilhas 24 / 37
Pilhas dinâmicas - Exemplo
push(10)push(20)push(30)poppush(40)push(50)poppush(100)push(200)
X 20 10 NULL
MC202 - Aula 4 Pilhas 25 / 37
Pilhas dinâmicas - Exemplo
push(10)push(20)push(30)poppush(40)push(50)poppush(100)push(200)
X 30 20 10 NULL
MC202 - Aula 4 Pilhas 26 / 37
Pilhas dinâmicas - Exemplo
push(10)push(20)push(30)poppush(40)push(50)poppush(100)push(200)
X 20 10 NULL
MC202 - Aula 4 Pilhas 27 / 37
Pilhas dinâmicas - Exemplo
push(10)push(20)push(30)poppush(40)push(50)poppush(100)push(200)
X 40 20 10 NULL
MC202 - Aula 4 Pilhas 28 / 37
Pilhas dinâmicas - Exemplo
push(10)push(20)push(30)poppush(40)push(50)poppush(100)push(200)
X 50 40 20 10 NULL
MC202 - Aula 4 Pilhas 29 / 37
Pilhas dinâmicas - Exemplo
push(10)push(20)push(30)poppush(40)push(50)poppush(100)push(200)
X 40 20 10 NULL
MC202 - Aula 4 Pilhas 30 / 37
Pilhas dinâmicas - Exemplo
push(10)push(20)push(30)poppush(40)push(50)poppush(100)push(200)
X 100 40 20 10 NULL
MC202 - Aula 4 Pilhas 31 / 37
Pilhas dinâmicas - Exemplo
push(10)push(20)push(30)poppush(40)push(50)poppush(100)push(200)
X 200 100 40 20 10 NULL
MC202 - Aula 4 Pilhas 32 / 37
Mão na massa!
Let’s code 2!
MC202 - Aula 4 Pilhas 33 / 37
Balanceamento de parênteses
Problema clássico: verificar se uma sequência de [,],( e ) ébalanceada ou bem-formada.
()([])([)]([()]()))(([)([([][()])])[([])[([]])](([((()([](([]))[]))]))
Como resolver este problema?
MC202 - Aula 4 Pilhas 34 / 37
Balanceamento de parênteses
• Comece com a pilha vazia;• Enquanto tiver sı́mbolos na entrada
• Leia o próximo sı́mbolo x da entrada;• Se x = [ ou x = ( então empilhe x;• Se x =] ou x =) então
veja se o que está no topo casa com x;• Se SIM então desempilhe;• Senão Não é balanceada;
• Verifique se a pilha está vazia;• Se SIM então Está balanceada;• Senão Não é balanceada;
MC202 - Aula 4 Pilhas 35 / 37
Balanceamento - Exemplo
MC202 - Aula 4 Pilhas 36 / 37
Mão na massa!
Let’s code 3!
MC202 - Aula 4 Pilhas 37 / 37