A fila é uma estrutura de dados que armazena elementos em uma ordem específica, seguindo o princípio FIFO (First In, First Out). O primeiro elemento a entrar é o primeiro a sair. Assim como uma fila no mundo real, as pessoas entram no fim da fila e são atendidas pela frente.
Exemplo prático: imagine uma fila de banco. As pessoas entram no fim e são atendidas pela pessoa que está no início.
Dicas: use uma lista para armazenar os elementos; adicionar no fim pode ser feito com append, remover do início com pop(0) (em Python) ou com operações equivalentes em outras linguagens.
Observação: apesar de ambas serem estruturas lineares, seus comportamentos de inserção/remissão são opostos. Em pilhas, a remoção ocorre no topo; em filas, a remoção ocorre no início.
Observação: além dessas, podem existir operações auxiliares (ex.: tamanho da fila, imprimir o conteúdo). Em implementações com listas, a remoção do início normalmente usa index 0.
Esta é uma implementação conceitual de uma fila usando uma lista (data) para armazenar os elementos.
class Fila:
def __init__(self):
self.data = [] # fila vazia
def inserir(self, x):
self.data.append(x) # adiciona no fim
def remover(self):
if len(self.data) > 0:
return self.data.pop(0) # remove do início
raise IndexError("fila vazia")
def top(self):
if len(self.data) > 0:
return self.data[0] # próximo elemento a sair
return None
def vazia(self):
return len(self.data) == 0Resumo rápido:
Observação: em Python puro, floatações de tempo podem ser ineficientes para filas muito grandes, pois pop(0) desloca toda a lista. Em produção, pode-se usar collections.deque para O(1) tanto enqueue quanto dequeue.
Desenhe um sistema com duas filas para clientes:
Regras:
Implemente esse comportamento usando a classe Fila apresentada anteriormente (ou a sua versão em Python). Pense em como controlar contadores de saídas para cada fila e quando acionar a remoção da fila normal.
class Queue():
def __init__(self):
self.priority = []
self.normal = []
self.count = 0
def add(self, a):
if a >= 60:
self.priority.append(a)
else:
self.normal.append(a)
def remove(self):
if self.count <= 1 and len(self.priority) > 0:
self.count += 1
print(f"priority: {self.priority[0]}")
return self.priority.pop(0)
elif len(self.normal) > 0 and self.count > 1:
self.count = 0
print(f"normal: {self.normal[0]}")
return self.normal.pop(0)
elif len(self.normal) > 0:
self.count = 0
print(f"normal: {self.normal[0]}")
return self.normal.pop(0)
elif len(self.priority) > 0:
self.count += 1
print(f"priority: {self.priority[0]}")
return self.priority.pop(0)
return None
q = Queue()
c = 1
for i in range(50, 72):
q.add(i)
c += 1
print(f"priority: {q.priority}")
print(f"normal: {q.normal}")
for i in range(0, c):
q.remove()
A seguir, resumos estruturados para cada tópico apresentado.
Resposta correta: C) Remover o primeiro elemento e inserir no fim
Resposta correta: A) top
Resposta correta: A) append
Resposta correta: A) A cada duas saídas da fila prioritária, deve haver uma saída da fila normal
store supplies o Olá pessoal bem-vindos novamente nossa disciplina de algoritmos e programação de computadores dois e a gente está tendo essa série de videoaulas dessa semana onde a gente está vendo algumas estruturas de dados que são importantes para a formação de vocês.
E agora, nesta videoaula, a gente vai aprender um pouquinho sobre o conceito de filas.
Então, só repassando o que a gente viu na aula passada, que foi sobre pilhas, são as contas que são parecidos, mas eles têm comportamentos diferentes dessas duas estruturas de dados.
Então, enquanto que pilhas a gente tinha uma certa regra para poder fazer a inserção e remoção de elementos, então o último elemento que entra na pilha é o primeiro a ser removido, no caso de filas, o processo já é diferente.
Então, para filas, você vai ter um comportamento parecido, exatamente como uma fila do mundo real, onde você tem, por exemplo, uma fila de banco e as pessoas entram na fila para serem atendidas.
E o primeiro que entra nessa fila vai ser o primeiro a ser atendido.
Então, quando você tem elementos que vão sendo enceridos, esses elementos são sempre enceridos no final da fila.
E conforme você vai removendo elementos dessa fila, então conforme essas pessoas vão sendo atendidas, a fila vai andando.
Então, você sempre vai pegando o próximo elemento dessa fila.
Então, a ordem de remoção de elementos da fila é sempre igual a ordem de inserção desses elementos.
Então, quem entra na fila entra sempre no final da fila e quem sai da fila sai do início da fila.
Bom, então, uma definição mais formal de filas, então, uma fila é uma estrutura para armazenar o conjunto de elementos que funciona da seguinte forma.
Então, novos elementos sempre entram no fim da fila.
E o único elemento que pode ser retirado desta fila em um determinado momento é o seu primeiro elemento, o elemento que está lá no início da fila.
Para que serve, então, usar essa estrutura de dados fila, então essa estrutura, pessoal, serve para modelar situações em que é necessário armazenar um conjunto ordenado de elementos, no qual o primeiro elemento a entrar no conjunto será também o primeiro elemento a sair e assim por diante.
Então, imagine, por exemplo, aplicações diversas como você tem lá, por exemplo, uma fila de banco, ou você tem uma fila de espera por livros em uma biblioteca.
Então, no caso, cada livro teria sua respectiva fila de pessoas aguardando para emprestar em um livro.
E assim por diante, então, você tem número das aplicações aí, onde essa situação de ordem, de inserção, e de remoção deve ser a mesma.
A gente tem algumas operações usuais para a fila.
Então, a gente tem a operação de inserir um elemento, então, inserir o elemento no fim da fila sempre, remover um elemento, então, a remoção de um elemento é sempre o primeiro elemento dessa fila, e a função impite que é verificar se a fila está vazia ou não.
A gente tem outras operações também, que podem ser criadas como o top, então, você pode implementar a função top, que é saber quem que é o próximo elemento se é removido, sem de fato, remover esse elemento, é o perisparecido com o que a gente fez com as pilhas, entre outras funções também, que são auxiliares, e que podem auxiliar na definição desta classe fila.
Então, antes de a gente implementar a nossa classe fila, e eu vou deixar como exercício este aqui para vocês fazerem.
Então, antes de eu explicar este exercício para vocês tentarem fazer, vamos a implementação da classe fila.
Muito bem, então, eu tenho aqui um meu arquivo.
pi, pessoal, aberto, nesse arquivo é onde eu vou implementar a minha classe fila.
Essa classe vai ter também uma função em it, que vai ser chamada automaticamente quando a gente criar um objeto desta classe fila, o que a gente vai implementar dentro desta função em it.
Então, aqui, pessoal, é onde vocês podem inicializar quaisquer variáveis que você tenha na sua classe.
Então, eu posso, por exemplo, usar uma variável data que vai ser inicializada como uma lista vazia, então, tipo list da linguagem Python, é o que eu posso utilizar para armazenar os elementos da minha fila desta classe que eu estou implementando.
Aí, eu posso definir a função de inserir um elemento x dentro da minha lista.
Então, a inserção, pessoal, envolve eu armazenar esse elemento sempre no final da minha lista.
Então, isso equivale, então, eu chamar a função append, a função append é uma função da lo tipo list da linguagem Python, que sempre concaterna um elemento passado comparâmetro no final da lista que já foi criada.
Então, a gente já tem a criação da fila, uma variável data, e aqui, a gente está inserindo o elemento sempre à direita desta lista, sempre no final desta lista.
Podemos também implementar a função, remover um elemento desta lista.
Bom, assim como a gente fez com ilhas, para a gente remover um elemento dela, a gente tem que verificar primeiro se ela não estava vazia.
Se, porque se eu não consegue remover nenhum elemento da fila, se a fila estiver vazia, então a gente pode fazer uma verificação.
Se o self.
data, que é dizer a nossa estrutura interna de lista, é for maior do que zero.
Se for maior do que zero, a gente vai retornar o self.
data numa posição específica.
Essa posição, pessoal, a gente passa por meio da função pop, que também está implementada na classe list da linguagem Python, e a gente coloca, entre parênteses, o índice do elemento que a gente quer remover.
No caso da pilha, a gente estava fazendo menos um, porque, ao menos um, vai pegar o elemento mais à direita da lista.
Só que a gente que seria, na verdade, o último elemento que foi inserido lá pelo push.
Aqui como é fila, a gente vai remover o primeiro elemento da fila, quer dizer, o elemento que está mais à esquerda.
O elemento que está mais à esquerda está na posição zero.
Por isso, a gente vai usar o índice zero aqui na função pop da variável data, que é do tipo list.
Podemos implementar também a função top, que é simplesmente verificar qual é o próximo elemento, que vai ser removido, só que, sem de fato, implementa ele.
Reparem que aqui, a gente está simplesmente acessando o elemento da posição zero da lista, sem fazer a remoção dele.
Simplesmente, estou consultando aquele elemento daquela posição zero.
E, por fim, eu vou implementar a função empate, que vai me retornar a verdadeiro caso a fila esteja vazia.
Ter posso chamar um, fazer um retorno, not, len, de self.
data, maior do que zer.
Então, ele vai me retornar se a minha lista, o tamanho da minha lista, for maior do que zero, quer dizer que eu tenho o elemento na minha fila.
Então, isso aqui me retornaria a verdadeiro.
E, aí, como eu estou negando, eu vou retornar a falsa.
Então, essa função vai me retornar a verdadeiro caso a fila esteja vazia.
E, falso, caso ela não esteja vazia.
Tudo bem? Então, essa foi a implementação da fila.
A gente pode criar um objeto do tipo fila.
Podemos inserir alguns elementos.
Vou inserir o elemento 1, 2, 3 e 4.
E agora, eu vou começar a removê os elementos.
Então, a remoção repara que, agora, estou removendo sempre na ordem que eu inserir.
Então, remove primeiro o elemento 1, depois o 2, depois o 3, depois o 4.
Então, sempre na ordem de inserção.
E isso é o que caracteriza uma fila.
Muito bem.
Então, pessoal, o que eu quero que vocês têm que fazer? Emplementar um programa de gerenciamento de duas filas em um banco.
Imagina que você tem um banco, uma instituição financeira.
Você tem um gichê.
E nesse gichê recebe pessoas clientes que estão organizados em duas filas.
Ou a fila prioritária, ou a fila normal.
O que seu programa deve fazer? Ele deve permitir que pessoas sejam inseridas no fim de cada fila dependendo da idade cada um.
Então, pessoas acima de 60 anos vão entrar na fila prioritária.
E pessoas abaixo de 60 anos entram na fila normal.
Então, o seu programa vai pedir, vai perguntar para o usuário qual a idade da pessoa.
Se for acima de 60 anos, você vai inserir na fila prioritária.
E se não, caso contrário, vai inserir na fila normal.
Então, você vai ter esse processo de inserção de elementos nessas duas filas.
E a saída das pessoas da fila deve ocorrer desta forma que está aí.
Então, a cada duas pessoas que saírem da fila prioritária, uma saída de fila normal.
Então, a ideia que vocês implementem um algoritmo, que realises exatamente esse processo de inserção e remoção de elementos nessas duas filas.
E isso tudo utilizando essa classe fila que a gente acabou de implementar.
Então, pessoal, esta foi a nossa videoaula sobre filas.
Espero que vocês tenham entendido o conceito de filas, a ideia principal de inserção e remoção de elementos.
E agradeço, então, pela atenção de vocês.
E a gente se vê numa próxima videoaula ainda continuando nesta semana sobre as principais estruturas de dados.
Obrigado e até lá!