1 of 16

Estruturas de Dados Derivadas:�Pilhas, Filas e Matrizes Esparsas

2 of 16

PILHAS

3 of 16

Pilha (em inglês, Stack)

  • Pilha é uma das estruturas de dados abstratas mais conhecidas e utilizadas
  • Basta pensar em uma pilha de pratos
  • LIFO (Last In, First Out):
    • o último a entrar é o primeiro a sair

4 of 16

  • Em Python, a maneira mais simples de implementar pilhas é usar uma lista
  • Com esta lista, basta restringir as operações possíveis, que serão apenas duas:
    • Empilhar (push): em Python, use pilha.append(elemento)
    • Desempilhar (pop): em Python, use pilha.pop()

Criando pilhas a partir de listas

pilha = [] # cria pilha vazia

pilha.append(10)

pilha.append(6)

dado = pilha.pop()

print(dado) # mostra o 6

dado = pilha.pop()

print(dado) # mostra o 10

5 of 16

Exemplo 5: Faça um programa de pilha de cartas de um baralho, que use ‘c’ para colocar uma carta na pilha, ‘r’ para retirar uma carta da pilha e ‘p’ para parar.

pilha = []

while True:

comando = input('(c)olocar / (r)etirar / (p) parar: ')

if comando == 'c':

carta = input('Qual a carta? ')

pilha.append(carta)

elif comando == 'r':

if pilha:

carta = pilha.pop()

print(carta)

else:

print('Não há nenhuma carta na pilha.')

elif comando == 'p':

if not pilha:

break

else:

print('A pilha ainda tem cartas.')

opção = input('Parar? (s/n): ')

if (opção == 's' or opção == 'S'):

break

else:

print('Comando inexistente!')

6 of 16

FILAS

7 of 16

Filas (em inglês, Queue)

  • Fila é outra estrutura de dados abstrata muito conhecida e utilizada
  • Basta pensar em uma fila de restaurante
  • FIFO (First In, First Out):
    • o primeiro a entrar é o primeiro a sair

8 of 16

  • Em Python, a maneira mais simples de implementar filas é usar uma lista
  • Com esta lista, basta restringir as operações possíveis, que serão apenas duas:
    • Enfileirar (enqueue): em Python, pilha.append(elemento)
    • Desenfileirar (dequeue): em Python, use pilha.pop(0)

Criando filas a partir de listas

fila = [] # cria fila vazia

fila.append(10)

fila.append(6)

dado = fila.pop(0)

print(dado) # mostra o 10

dado = fila.pop(0)

print(dado) # mostra o 6

9 of 16

Exemplo 6: Faça um programa de fila de atendimento, que use ‘a’ para atender, ‘c’ quando chegar alguém e ‘p’ para parar.

fila = []

while True:

comando = input('(c)hegada / (a)tender / (p) parar: ')

if comando == 'c':

nome = input('Nome do cliente: ')

fila.append(nome)

elif comando == 'a':

if fila:

nome = fila.pop(0)

print(nome)

else:

print('Não há ninguém na fila.')

elif comando == 'p':

if not fila:

break

else:

print('A fila ainda contém os seguintes clientes: ')

for nome in fila:

print(nome)

opção = input('Parar? (s/n): ')

if (opção == 's' or opção == 'S'):

break

else:

print('Comando inexistente!')

10 of 16

Exercícios

  1. Escreva uma função que verifica se uma string é ou não um palíndromo. Palíndromo é uma palavra ou expressão que invertida é exatamente igual à palavra ou expressão original. Por exemplo, "osso" e "ana" são palíndromos, mas "casa" não é, pois sua forma invertida "asac" não é igual à original. Para resolver o problema você pode usar uma pilha de caracteres. Use TDD, testando palíndromos com número de caracteres par e ímpar ("osso" e "ana" são exemplos) e palavras que não são palíndromos. A função só é definida para strings com pelo menos um caractere.
    • Dica: para transformar uma string em lista, basta usar a função list().
    • Por exemplo, lista = list(str) converte a variável str em uma lista de caracteres.
  2. Escreva um programa que simule o controle de uma pista de decolagem de aviões em um aeroporto. Neste programa, o usuário deve ser capaz de realizar as seguintes tarefas:

a) Listar o número de aviões aguardando na fila de decolagem;

b) Autorizar a decolagem do primeiro avião da fila;

c) Adicionar um avião à fila de espera;

d) Listar todos os aviões na fila de espera;

e) Listar as características do primeiro avião da fila.

Considere que os aviões possuem um nome e um número inteiro como identificador. Adicione outras características conforme achar necessário.

11 of 16

MATRIZES ESPARSAS A PARTIR DE DICIONÁRIOS

12 of 16

  • Em Python, uma maneira eficiente de criar matrizes consiste em usar dicionários
  • Para representar linhas e colunas, usamos uma tupla de dimensão 2, onde:
    • o primeiro componente é o índice da linha
    • o segundo componente é o índice da coluna

Criando matrizes a partir de dicionários

# Em Python:

matriz = {(1,1):2,(1,2):4,(2,1):7,(2,2):9}

print(matriz[(2,1)]) # mostra 7

print(matriz[(2,2)]) # mostra 9

matriz[(2,2)] = 15

print(matriz[(2,2)]) # mostra 15

matriz[(1,1)] = int(input())

print(matriz[(1,1)]) # mostra o que digitou

13 of 16

Alterando o Exemplo 2 da aula sobre matrizes para ter um loop a menos: Com dicionários, é possível

a, b, c = {}, {}, {}

for i in range(3):

for j in range(4):

print('Digite o elemento %d,%d da matriz A: ' % (i+1,j+1))

a[(i,j)] = int(input())

for i in range(3):

for j in range(4):

print('Digite o elemento %d,%d da matriz B: ' % (i+1,j+1))

b[(i,j)] = int(input())

print('\nMatriz resultante:\n')

for i in range(3):

for j in range(4):

c[(i,j)] = a[(i,j)] + b[(i,j)]

print('%5d ' % c[(i,j)], end = '')

print()

14 of 16

  • A maior vantagem de usar dicionários é que não é preciso armazenar todos os valores da matriz
  • Por exemplo, uma matriz 200x100 com apenas o elemento da posição (15,25) sendo diferente de zero pode ser criado assim:

matriz = {}

matriz[(15,25)] = 32

print(matriz[(15,25)])

# Mas, imprimir uma chave inexistente dá erro

print(matriz[(3,8)]) # Como corrigir este erro?

  • Para corrigir o erro, usamos a função get() com valor default zero para acessar os elementos:

print(matriz.get((15,25),0)) # mostra 32

print(matriz.get((3,8),0)) # mostra 0

  • Outra vantagem é que os índices não precisam começar de zero. Na verdade, nem precisam ser inteiros.

Vantagens de usar dicionários para matrizes

15 of 16

Exemplo 4: Faça um programa que use um dicionário para guardar as reservas de um teatro, considerando que as filas do teatro usam uma letra entre ‘a’ e ‘z’ para identificação e cada cadeira usa um número.

PRIMEIRA_FILA = 'a'

ÚLTIMA_FILA = 'z'

CADEIRAS = 40

lugares = {} # matriz booleana de lugares no teatro

continua = 's'

while continua == 's' or continua == 'S':

reserva_fila = input('Fila: ')

reserva_cadeira = int(input('Cadeira: '))

reservado = lugares.get((reserva_fila,reserva_cadeira), False)

if reservado:

print('Este lugar já está reservado...')

else:

lugares[(reserva_fila,reserva_cadeira)] = True

print('Reserva realizada!')

continua = input('Nova reserva? (s/n): ')

print('Fim!')

16 of 16

Exercícios

  • Usando dicionários para implementar matrizes, escreva um programa que leia um número inteiro e uma matriz 4 x 4 de inteiros, e obtenha uma segunda matriz resultado do produto da matriz original pelo número lido. Imprima a matriz resultado.
  • Usando dicionários para implementar matrizes, escreva um programa que leia uma matriz 10x10 e encontre e imprima o maior e o menor elemento da matriz.
  • Usando dicionários para implementar matrizes, escreva um programa que leia as notas das 5 provas de 50 alunos e armazene-as em uma matriz e calcule e imprima as médias das 5 notas de cada um dos 50 alunos. Calcule ainda a maior média e a quantidade de alunos com média maior ou igual a 7.