04 Stacks e Queues
04 Stacks e Queues
04 Stacks e Queues
2023/2024
Aula 4 (7 e 8)
Algoritmia e
Estruturas de
Dados
Joana Martinho Costa, João Matos, João Monge, Miguel Sales Dias, Paulo Vieira
No episódio anterior...
N
1 Acessos a array
No episódio anterior...
N
N-1
2 Acessos a array
No episódio anterior...
N
N-1
N-2
3 Acessos a array
No episódio anterior...
Stacks e Queues
• Stacks
• Resizing arrays
• Queues
• Aplicações
Stacks e Queues
• Tipos de dados fundamentais
• Operações: insert, remove, iterate, test (para testar se está vazio)
1. Lê uma String
def main(): 2. Se a String for igual a “-”, executa
for line in sys.stdin: pop da stack e imprime
stack = StackOfStrings()
for item in line.split(): 3. Se não, faz push para a stack
if item == "-":
print(stack.pop(), " ", end='')
else:
stack.push(item)
Como construir os métodos da
Stack?
• Através de uma estrutura Linked-List
• Através de um array
Versão 1: Stack com
Linked-List
Joana Martinho Costa, João Matos, João Monge, Miguel Sales Dias, Paulo Vieira
O que é uma
linked-list?
• Uma lista ligada (ou encadeada) é uma
estrutura de dados que liga vários nós.
• Cada nó tem um apontador para o nó
seguinte.
class Node:
def __init__(self, item, next_node):
self.item = item
self.next = next_node
Stack com Linked-List
def is_empty(self):
return self.first is None
def pop(self):
class Node: item = self.first.item
def __init__(self, item, next_node): self.first = self.first.next
self.item = item return item
self.next = next_node
Tarefa a)
b)
Dois push (inteiros 34 e 67)
Um pop
a) Imprime o valor que saiu da stack
Análise da performance da
Stack com Linked-List
Todas as operações (criação, verificar se está
vazio, push e pop) têm um custo de execução
constante no pior caso
Joana Martinho Costa, João Matos, João Monge, Miguel Sales Dias, Paulo Vieira
Stack com Array
• Usar um array s[] para guardar N itens numa stack
• Método push: adiciona itens ao s[N]
• Método pop: retira itens do s[N-1]
• Características
• Lança uma exceção se chamar o pop() numa stack vazia
• Se a stack encher, é necessário fazer o resizing ao array
• Valores null podem ser inseridos
• Existe um problema de loitering que consiste em manter em memória
valores que já não são usados
Stack com Array
def pop(self):
def pop(self):
self.N -= 1
self.N -= 1
item = self.s[self.N]
return self.s[self.N]
self.s[self.N] = None
return item
Loitering
Resizing
Joana Martinho Costa, João Matos, João Monge, Miguel Sales Dias, Paulo Vieira
Resizing
• Tentativa 1
• Push(): aumenta o tamanho do array s[] para +1
• Pop(): diminui o tamanho do array s[] para -1
• Tentativa 1
• Push(): duplica o array s[] quando está preenchido
• Pop(): reduz o array s[] para metade quando está metade preenchido
Joana Martinho Costa, João Matos, João Monge, Miguel Sales Dias, Paulo Vieira
Queues
Queues
def dequeue(self):
item = self.first.item
self.first = self.first.next
return item
def is_empty(self):
return self.first is None
Queue com Resizing