Você está na página 1de 28

Pilha - Conteúdo das Aulas

• Estrutura de dados Pilha

• Implementação usando Vetor

• Implementação usando Lista

Algoritmos e Estruturas de Dados 1


Aula 12 – Pilha
• ADT (Abstract Data Type)

• Contém elementos do mesmo tipo organizados em ondem linear

• Operação são permitidas apenas no fim

• Não é permitido inserção e remoção no meio da estrutura

• Implementadas usando vetores e lista ligadas

Algoritmos e Estruturas de Dados 2


Aula 12 – Pilha
• Inserção e Remoção são permitidas apenas em uma extremidade

• LIFO Last In First Out

• O último a entrar é o primeiro a sair

Algoritmos e Estruturas de Dados 3


Aula 12 – Pilha
• Inserção e Remoção são permitidas apenas
em uma extremidade
• Topo da pilha

• Inserção e Remoção possuem nomes


especiais
• Push - operação de inserção/empilhar

• Pop - operação de
remoção/desempilhar

Algoritmos e Estruturas de Dados 4


Aula 12 – Pilha
• Inserção e Remoção possuem nomes especiais

• Antes de uma operação Push garantir que a pilha não está cheia

• Overflow

• Antes de uma operação Pop garantir que a pilha não está vazia

• Underflow

Algoritmos e Estruturas de Dados 5


Aula 12 – Pilha
• Implementação de Pilha usando vetor

• Vetor de 1 dimensão - armazena os elementos da pilha

• topo – índice do elemento no topo da pilha

• Pilha vazia – topo é -1

Algoritmos e Estruturas de Dados 6


Aula 12 – Pilha
• Implementação de Pilha usando vetor

• Operação Push

• topo é incrementado em 1

• Um novo elemento é inserido no índice topo

• Operação Pop

• Elemento no índice topo é retirado da pilha

• topo é decrementado em 1

Algoritmos e Estruturas de Dados 7


Aula 12 – Pilha
• Implementação de Pilha usando vetor

Algoritmos e Estruturas de Dados 8


Aula 12 – Pilha (Python)
• Implementação de Pilha usando vetor class PilhaVetor(object):
    def __init__(self, tamanho=10):
        self.vetor = [i for i in range(tamanho)]
• Matriz de uma dimensão         self.topo = -1

• topo – índice do elemento no


topo da pilha
• topo = -1

Algoritmos e Estruturas de Dados 9


Aula 12 – Pilha (Python)
• Implementação de Pilha usando vetor # insere um novo elemento na pilha / push
def empilhar(self, x):
    if (self.verificarCheia()):
• Operação Push # stack overflow
print("Pilha Sobrecarregada")

• topo incrementado         return

    self.topo = self.topo + 1
• Novo elemento em topo     self.vetor[self.topo] = x

Algoritmos e Estruturas de Dados 10


Aula 12 – Pilha (Python)
• Implementação de Pilha usando vetor # remove o elemento no topo da pilha / pop
def desempilhar(self):
    if (self.verificarVazia()):
• Operação Pop         print("Pilha Vazia") # stack underflow

        return
• Elemento retirado do topo     x = self.vetor[self.topo]
    self.topo = self.topo - 1
• topo decrementado
return x

Algoritmos e Estruturas de Dados 11


Aula 12 – Pilha (Python)
• Implementação de Pilha usando vetor
1  class PilhaVetor(object): 18     # insere um novo elemento na pilha / 
2      def __init__(self, tamanho=10): push
3       self.vetor = [i for i in range(tamanho)] 19     def empilhar(self, x):
4       self.topo = -1 20      if (self.verificarCheia()):
5   21          print("Pilha Sobrecarregada")
6      # retorna o numero de elementos na pilha # stack overflow
7      def obterTamanho(self): 22 
8       return self.topo + 1 23          return
9           24 
10     # verifica se a pilha esta vazia 25      self.topo = self.topo + 1
11     def verificarVazia(self): 26      self.vetor[self.topo] = x
12      return (self.topo == -1) 27 
13  28     # remove o elemento no topo da pilha / pop
14     # verifica se a pilha esta cheia 29     def desempilhar(self):
15     def verificarCheia(self): 30      if (self.verificarVazia()):
16         return (self.topo == len(self.vetor) - 1) 31          print("Pilha Vazia") 
# stack underflow
32 
33          return
34 
35      x = self.vetor[self.topo]
36      self.topo = self.topo - 1
37 
38      return x

Algoritmos e Estruturas de Dados 12


Aula 12 – Pilha (Python)
• Implementação de Pilha usando vetor
40     # retorna o elemento no topo da pilha sem 
remove-lo / peek
41     def exibirTopo(self):
42      if (self.verificarVazia()):
43          print("Pilha Vazia") # stack underflow
44             
45          return
46     
47      return self.vetor[self.topo]
48 
49     # exibe todos os elementos da pilha
50     def exibir(self):
51      if (self.verificarVazia()):
52          print("Pilha Vazia")
53 
54          return
55         
56      print("Pilha ")
57         
58      for i in range(0, self.topo + 1):
59          print(str(self.vetor[i]) + " ")
60         
61      print()

Algoritmos e Estruturas de Dados 13


Aula 12 – Pilha (Python)
• Implementação de Pilha usando vetor (Demonstração)
1  from pilha_vetor import PilhaVetor 24 def exibirTopo():
2   25     print("Elemento no Topo " + 
3  pilha = PilhaVetor() str(pilha.exibirTopo())) # peek
4   26 
5  def escolherOpcao(escolha): 27 def exibir():
6      opcoes = { 28     pilha.exibir()
7       1: empilhar, 29 
8       2: desempilhar, 30 def obterTamanho():
9       3: exibirTopo, 31     print("Tamanho da Pilha " + 
10      4: exibir, str(pilha.obterTamanho()))
11      5: obterTamanho,  
12     }
13     
14     opcoes.get(escolha, "")()
15 
16 def empilhar():
17     x = int(input('Entre com o Elemento que
sera Empilhado ')) # push
18     pilha.empilhar(x)
19 
20 def desempilhar():
21     x = pilha.desempilhar()
22     print("Desempilhado elemento " + str(x)) # pop
23 

Algoritmos e Estruturas de Dados 14


Aula 12 – Pilha (Python)
• Implementação de Pilha usando vetor (Demonstração)
33 def main():
34     
35     while(True):
36         print('1. Empilhar um Elemento (Push)')
37      print('2. Desempilhar um Elemento (Pop)')
38      print('3. Exibir o Elemento no Topo')
39      print('4. Exibir Todos os Elementos na 
Pilha')
40      print('5. Exibir o Tamanho da Pilha')
41      print('6. Sair')
42 
43      escolha = int(input('escolha uma opcao: '))
44 
45      if (escolha == 6):
46      break
47         
48      escolherOpcao(escolha)
49 
50 if __name__ == "__main__":
51     main()

Algoritmos e Estruturas de Dados 15


Aula 12 – Pilha
• Implementação de Pilha usando Lista

• Topo da Pilha – Inicio da Lista Ligada

• Operação Push

• Um nó é inserido no inicio da Lista

• Operação Pop

• Remove o primeiro nó da Lista

Algoritmos e Estruturas de Dados 18


Aula 12 – Pilha
• Implementação de Pilha usando Lista

• topo – referência ao primeiro nó da Lista

• Pilha vazia – topo é nulo

Algoritmos e Estruturas de Dados 19


Aula 12 – Pilha
• Implementação de Pilha usando Lista

• Push – Inserir / Empilhar

• Mesmo que a inserção no inicio da


Lista Ligada Simples

Algoritmos e Estruturas de Dados 20


Aula 12 – Pilha
• Implementação de Pilha usando Lista

• Pop – Remover / Desempilhar

Algoritmos e Estruturas de Dados 21


Aula 12 – Pilha
• Implementação de Pilha usando Lista

Algoritmos e Estruturas de Dados 22


Aula 12 – Pilha
• Implementação de Pilha usando Lista from no import No

class PilhaLista(object):
• Classe PilhaLista que     def __init__(self):
        self.topo = None
implementa a pilha usando Lista
Ligada Simples
• Referência topo que sempre se
refere ao topo da lista

Algoritmos e Estruturas de Dados 23


Aula 12 – Pilha
• Implementação de Pilha usando Lista class No(object):
    def __init__(self, info):
        self.info = info
• Classe No – representa um         self.proximo = None

elemento na lista ligada simples

Algoritmos e Estruturas de Dados 24


Aula 12 – Pilha
• Implementação de Pilha usando Lista # insere um novo elemento na pilha / push
def empilhar(self, info):
    no = No(info)
• Método Push – insere um novo     no.proximo = self.topo
    self.topo = no
elemento na pilha
• Um novo nó é inserido no inicio da
lista ligada

Algoritmos e Estruturas de Dados 25


Aula 12 – Pilha
• Implementação de Pilha usando Lista # remove o elemento no topo da pilha / pop
def desempilhar(self):
    if (self.verificarVazia()):
• Método Pop – exibe e remove o         print("Pilha Vazia") # stack underflow

elemento no topo da lista         return

    info = self.topo.info
• O primeiro nó da lista é eliminado     self.topo = self.topo.proximo

    return info

Algoritmos e Estruturas de Dados 26


Aula 12 – Pilha (Python)
• Implementação de Pilha usando Lista
1 class No(object): 1  from no import No
2     def __init__(self, info): 2  
3         self.info = info 3  class PilhaLista(object):
4         self.proximo = None 4      def __init__(self):
5          self.topo = None
6  
7      # retorna o numero de elementos na pilha
8      def    obterTamanho(self):
9          tamanho = 0
10         p = self.topo
11 
12         while (p is not None):
13             p = p.proximo
14             tamanho = tamanho + 1
15     
16         return tamanho
17 
18     # verifica se a pilha esta vazia
19     def verificarVazia(self):
20         return (self.topo is None)
21

Algoritmos e Estruturas de Dados 27


Aula 12 – Pilha (Python)
• Implementação de Pilha usando Lista
22     # insere um novo elemento na pilha / push 40     # retorna o elemento no topo da pilha sem 
23     def empilhar(self, info): remove-lo / peek
24         no = No(info) 41     def exibirTopo(self):
25         no.proximo = self.topo 42         if (self.verificarVazia()):
26         self.topo = no 43             print("Pilha Vazia") # stack underflow
27  45             return
28     # remove o elemento no topo da pilha / pop 46         
29     def desempilhar(self): 47         return self.topo.info
30         if (self.verificarVazia()): 48 
31             print("Pilha Vazia") # stack underflow 49     # exibe todos os elementos da pilha
32  50     def exibir(self):
33             return 51         p = self.topo
34  52 
35         info = self.topo.info 53         if (self.verificarVazia()):
36         self.topo = self.topo.proximo 54             print("Pilha Vazia")
37  56             return
38         return info 57         
39  58         print("Pilha ")
59         
60         while (p is not None):
61             print(str(p.info) + " ")
62             p = p.proximo
63         
64         print()

Algoritmos e Estruturas de Dados 28


Aula 12 – Pilha (Python)
• Implementação de Pilha usando Lista (Demonstração)
1  from pilha_lista import PilhaLista 24 def exibirTopo():
2   25     print("Elemento no Topo " + 
3  pilha = PilhaLista() str(pilha.exibirTopo())) # peek
4   26 
5  def escolherOpcao(escolha): 27 def exibir():
6      opcoes = { 28     pilha.exibir()
7          1: empilhar, 29 
8          2: desempilhar, 30 def obterTamanho():
9          3: exibirTopo, 31     print("Tamanho da Pilha " + 
10         4: exibir, str(pilha.obterTamanho()))
11         5: obterTamanho, 32
12     }
13     
14     opcoes.get(escolha, "")()
15 
16 def empilhar():
17     x = int(input('Entre com o Elemento que sera 
Empilhado ')) # push
18     pilha.empilhar(x)
19 
20 def desempilhar():
21     x = pilha.desempilhar()
22     print("Desempilhado elemento " + str(x)) # pop
23   

Algoritmos e Estruturas de Dados 29


Aula 12 – Pilha (Python)
• Implementação de Pilha usando Lista (Demonstração)
33 def main():
34 
35     while(True):
36         print('1. Empilhar um Elemento (Push)')
37         print('2. Desempilhar um Elemento (Pop)')
38         print('3. Exibir o Elemento no Topo')
39         print('4. Exibir Todos os Elementos na 
Pilha')
40         print('5. Exibir o Tamanho da Pilha')
41         print('6. Sair')
42 
43         escolha = int(input('escolha uma opcao: '))
44 

45         if (escolha == 6):
46             break
47         
48         escolherOpcao(escolha)
49 
50 if __name__ == "__main__":
51     main()

Algoritmos e Estruturas de Dados 30

Você também pode gostar