Python Fila: Exemplo FIFO, LIFO

โšก Resumo Inteligente

Python Uma fila รฉ uma estrutura de dados linear que armazena itens e os libera em uma ordem definida. O mรณdulo de filas oferece variantes FIFO, LIFO e de prioridade para gerenciar tarefas, armazenar dados em buffer e coordenar o trabalho entre threads de forma segura.

  • ๐Ÿ”ข FIFO: A classe Queue remove primeiro o item mais antigo, ideal para agendamento de tarefas e armazenamento em buffer.
  • ๐Ÿ” LIFO: A classe LifoQueue remove primeiro o item mais recente, comportando-se como uma pilha.
  • ๐Ÿ“ฆ Mรฉtodos principais: As funรงรตes put(), get(), qsize(), empty() e full() gerenciam itens e informam o estado da fila.
  • ๐Ÿงต Seguro para threads: O mรณdulo de fila gerencia o bloqueio, permitindo que vรกrias threads compartilhem uma mesma fila com seguranรงa.
  • ๐ŸŽฏ Prioridade: A PriorityQueue libera itens por prioridade, e nรฃo por ordem de inserรงรฃo.
  • ๐Ÿค– Ajuda da IA: Assistentes de IA geram cรณdigo de fila e explicam as vantagens e desvantagens dos algoritmos FIFO e LIFO a partir de um comando simples.

Python Fila FIFO LIFO

O que รฉ a Python Fila?

Uma fila รฉ um contรชiner que contรฉm dados. Os dados inseridos primeiro serรฃo removidos primeiro e, portanto, uma fila tambรฉm รฉ chamada de โ€œPrimeiro a entrar, primeiro a sairโ€ (FIFO). A fila tem duas extremidades dianteira e traseira. Os itens sรฃo inseridos pela parte traseira e removidos pela parte frontal.

Como a Python Fila de trabalho?

A fila pode ser facilmente comparada com o exemplo do mundo real: a fila de pessoas esperando na fila do balcรฃo, a pessoa que ficar primeiro receberรก o ingresso primeiro, seguida pela prรณxima pessoa e assim por diante. A mesma lรณgica vale para a estrutura de dados da fila.

Aqui estรก uma representaรงรฃo diagramรกtica da fila:

Python Fila de trabalho

O Traseiro representa o ponto onde os itens sรฃo inseridos dentro da fila. Neste exemplo, 7 รฉ o valor para isso.

O Frente representa o ponto onde os itens da fila serรฃo removidos. Se vocรช remover um item da fila, o primeiro elemento obtido serรก 1, conforme mostrado na figura.

O item 1 foi o primeiro a ser inserido na fila, e ao removรช-lo รฉ o primeiro a sair. Portanto, a fila รฉ chamada FIRST IN FIRST OUT (FIFO)

Python Fila de trabalho

Em uma fila, os itens sรฃo removidos em ordem e nรฃo podem ser removidos no meio. Vocรช simplesmente nรฃo pode remover o item 5 aleatoriamente da fila, para isso vocรช terรก que remover todos os itens anteriores ao 5. Os itens da fila serรฃo removidos na ordem em que forem inseridos.

Tipos de fila em Python

Existem basicamente dois tipos de fila em Python:

  • Fila Primeiro a Entrar, Primeiro a Sair: Para isso, o elemento que sair primeiro serรก o primeiro a sair. Para trabalhar com FIFO, รฉ necessรกrio chamar Fila() classe do mรณdulo de fila.
  • รšltimo a entrar, primeiro a sair: Aqui, o elemento que for inserido por รบltimo serรก o primeiro a sair. Para trabalhar com LIFO, vocรช deve chamar LifoQueue() classe do mรณdulo de fila.

Python fila de instalaรงรฃo

ร‰ muito fรกcil trabalhar com fila em python. Aqui estรฃo as etapas a seguir para usar a fila em seu cรณdigo.

Passo 1) Basta importar o mรณdulo queue, conforme mostrado abaixo:

import queue

O mรณdulo estรก disponรญvel por padrรฃo com python e vocรช nรฃo precisa de nenhuma instalaรงรฃo adicional para comeรงar a trabalhar com a fila. Existem 2 tipos de fila FIFO (primeiro a entrar, primeiro a sair) e LIFO (รบltimo a entrar, primeiro a sair).

Passo 2) Para trabalhar com fila FIFO, chame a classe Queue usando o mรณdulo queue importado conforme mostrado abaixo:

import queue
q1 = queue.Queue()

Passo 3) Para trabalhar com a fila LIFO, chame a classe LifoQueue() conforme mostrado abaixo:

import queue
q1 = queue.LifoQueue()

Mรฉtodos disponรญveis nas classes Queue e LifoQueue

A seguir estรฃo os mรฉtodos importantes disponรญveis nas classes Queue e LifoQueue:

  • colocar(item): Isso colocarรก o item dentro da fila.
  • pegar(): Isso retornarรก um item da fila.
  • vazio(): Ele retornarรก verdadeiro se a fila estiver vazia e falso se houver itens presentes.
  • qtamanho(): retorna o tamanho da fila.
  • completo(): retorna verdadeiro se a fila estiver cheia, caso contrรกrio, falso.

Exemplo de fila primeiro a entrar, primeiro a sair

No caso do primeiro a entrar, primeiro a sair, o elemento que sai primeiro serรก o primeiro a sair.

Adicionar um item em uma fila

Vamos trabalhar em um exemplo para adicionar um item em uma fila. Para comeรงar a trabalhar com a fila, primeiro importe o mรณdulo queue, conforme mostrado no exemplo abaixo.

Para adicionar um item, vocรช pode usar o mรฉtodo put() conforme mostrado no exemplo:

import queue
q1 = queue.Queue()
q1.put(10) #this will additem 10 to the queue.

Por padrรฃo, o tamanho da fila รฉ infinito e vocรช pode adicionar qualquer nรบmero de itens a ela. Caso queira definir o tamanho da fila o mesmo pode ser feito da seguinte forma

import queue
q1 = queue.Queue(5) #The max size is 5.
q1.put(1)
q1.put(2)
q1.put(3)
q1.put(4)
q1.put(5)
print(q1.full()) # will return true.

Saรญda:

True

Agora o tamanho da fila รฉ 5 e nรฃo levarรก mais de 5 itens, e o mรฉtodo q1.full() retornarรก verdadeiro. Adicionar mais itens nรฃo executarรก mais o cรณdigo.

Remover um item da fila

Para remover um item da fila, vocรช pode usar o mรฉtodo chamado get(). Este mรฉtodo permite itens da fila quando chamados.

O exemplo a seguir mostra como remover um item da fila.

import queue
q1 = queue.Queue()
q1.put(10)

item1 = q1.get()

print('The item removed from the queue is ', item1)

Saรญda:

The item removed from the queue is  10

Exemplo de fila Last In First Out

No caso de รบltimo na fila primeiro a sair, o elemento que for inserido por รบltimo serรก o primeiro a sair.

Para trabalhar com LIFO, ou seja, รบltimo na fila de saรญda, precisamos importar o mรณdulo de fila e utilizar o mรฉtodo LifoQueue().

Adicionar um item em uma fila

Aqui entenderemos como adicionar um item ร  fila LIFO.

import queue
q1 = queue.LifoQueue()
q1.put(10)

Vocรช deve usar o mรฉtodo put() em LifoQueue, conforme mostrado no exemplo acima.

Remover um item da fila

Para remover um item do LIFOqueue vocรช pode usar o mรฉtodo get().

import queue
q1 = queue.LifoQueue()
q1.put(10)

item1 = q1.get()

print('The item removed from the LIFO queue is ', item1)

Saรญda:

The item removed from the LIFO queue is  10

Adicione mais de 1 item em uma fila

Nos exemplos acima, vimos como adicionar um รบnico item e remover o item FIFO e LIFOqueue. Agora veremos como adicionar mais de um item e tambรฉm removรช-lo.

Adicionar um item em uma FIFOqueue

import queue
q1 = queue.Queue()

for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

Remover um item da FIFOqueue

import queue
q1 = queue.Queue()

for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

while not q1.empty():
print("The value is ", q1.get()) # get() will remove the item from the queue.

Saรญda:

The value is  0
The value is  1
The value is  2
The value is  3
The value is  4
The value is  5
The value is  6
The value is  7
The value is  8
The value is  9
The value is  10
The value is  11
The value is  12
The value is  13
The value is  14
The value is  15
The value is  16
The value is  17
The value is  18
The value is  19

Adicionar um item em uma fila LIFO

import queue
q1 = queue.LifoQueue()
for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

Remover um item da fila LIFO

import queue
q1 = queue.LifoQueue()

for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

while not q1.empty():
print("The value is ", q1.get()) # get() will remove the item from the queue.

Saรญda:

The value is  19
The value is  18
The value is  17
The value is  16
The value is  15
The value is  14
The value is  13
The value is  12
The value is  11
The value is  10
The value is  9
The value is  8
The value is  7
The value is  6
The value is  5
The value is  4
The value is  3
The value is  2
The value is  1
The value is  0 

Classificando fila

O exemplo a seguir mostra a classificaรงรฃo da fila. O algoritmo usado para classificaรงรฃo รฉ a classificaรงรฃo por bolha.

import queue
q1 = queue.Queue()
#Addingitems to the queue
q1.put(11)
q1.put(5)
q1.put(4)
q1.put(21)
q1.put(3)
q1.put(10)

#using bubble sort on the queue
n =  q1.qsize()
for i in range(n):
    x = q1.get() # the element is removed
    for j in range(n-1):
        y = q1.get() # the element is removed
        if x > y :  
            q1.put(y)   #the smaller one is put at the start of the queue
        else:
            q1.put(x)  # the smaller one is put at the start of the queue
            x = y     # the greater one is replaced with x and compared again with nextelement
    q1.put(x)

while (q1.empty() == False): 
print(q1.queue[0], end = " ")  
        q1.get()

Saรญda:

3 4 5 10 11 21

Reversing Queue

Para reverter a fila, vocรช pode usar outra fila e recursรฃo.

O exemplo a seguir mostra como reverter a fila.

Exemplo:

import queue
q1 = queue.Queue()

q1.put(11)
q1.put(5)
q1.put(4)
q1.put(21)
q1.put(3)
q1.put(10)

def reverseQueue (q1src, q2dest) :  
    buffer = q1src.get()
    if (q1src.empty() == False) :
reverseQueue(q1src, q2dest)      #using recursion
    q2dest.put(buffer)
return q2dest

q2dest = queue.Queue()
qReversed = reverseQueue(q1,q2dest)

while (qReversed.empty() == False): 
print(qReversed.queue[0], end = " ")  
        qReversed.get()

Saรญda:

10 3 21 4 5 11

Perguntas Frequentes

Uma fila รฉ FIFO (primeiro a entrar, primeiro a sair), ou seja, o item mais antigo sai primeiro, enquanto uma pilha รฉ LIFO (รบltimo a sair, primeiro a entrar, primeiro a sair), onde o item mais recente sai primeiro. PythonO mรณdulo de filas oferece Queue para comportamento FIFO e LifoQueue para comportamento de pilha.

Sim. As classes Queue, LifoQueue e PriorityQueue sรฃo projetadas para programas multithread e gerenciam o bloqueio internamente, permitindo que vรกrias threads produtoras e consumidoras compartilhem uma mesma fila sem condiรงรตes de corrida ou corrupรงรฃo de dados.

`queue.Queue` รฉ thread-safe e projetada para threads produtor-consumidor. `collections.deque` รฉ uma fila de propรณsito geral de ponta dupla mais rรกpida para cรณdigo de thread รบnica, que suporta inserรงรตes e remoรงรตes rรกpidas em ambas as extremidades.

Uma PriorityQueue libera itens em ordem de prioridade, em vez de ordem de inserรงรฃo. Vocรช insere tuplas (prioridade, dados) e o mรฉtodo get() retorna primeiro o item com a menor prioridade, o que รฉ adequado para escalonadores e algoritmos de caminho mais curto.

Por padrรฃo, o mรฉtodo get() bloqueia e aguarda atรฉ que um item esteja disponรญvel. Passe block=False ou use get_nowait() para lanรงar a exceรงรฃo queue.Empty imediatamente, em vez de esperar por um novo item.

Passe o tamanho mรกximo (maxsize) para o construtor, por exemplo, `queue.Queue(5)`. Quando a fila estiver cheia, o mรฉtodo `put()` ficarรก bloqueado atรฉ que haja espaรงo disponรญvel e o mรฉtodo `full()` retorne `True`. Um valor de `maxsize` igual a 0 significa uma fila ilimitada.

Os assistentes de IA geram cรณdigo de fila produtor-consumidor, explicam as vantagens e desvantagens de FIFO versus LIFO e sugerem se queue.Queue, deque ou asyncio.Queue รฉ mais adequado para o seu caso. Eles tambรฉm ajudam a identificar impasses e chamadas task_done() ausentes.

Sim. O GitHub Copilot completa automaticamente a configuraรงรฃo de filas, loops put() e get() e threads de trabalho a partir de um comentรกrio. As ferramentas de IA agรฉticas vรฃo alรฉm, refatorando cรณdigo bloqueante para asyncio.Queue e adicionando tratamento de erros em todo o arquivo.

Resuma esta postagem com: