Python Cola: Ejemplo FIFO, LIFO

โšก Resumen inteligente

Python Una cola es una estructura de datos lineal que almacena elementos y los libera en un orden definido. El mรณdulo de cola proporciona variantes FIFO, LIFO y de prioridad para gestionar tareas, almacenar datos en bรบfer y coordinar el trabajo entre hilos de forma segura.

  • ๐Ÿ”ข FIFO: La clase Queue elimina primero el elemento mรกs antiguo, lo que resulta ideal para la programaciรณn de tareas y el almacenamiento en bรบfer.
  • ๐Ÿ” LIFO: La clase LifoQueue elimina primero el elemento mรกs reciente, comportรกndose como una pila.
  • ๐Ÿ“ฆ Mรฉtodos bรกsicos: Las funciones put(), get(), qsize(), empty() y full() gestionan los elementos e informan sobre el estado de la cola.
  • ๐Ÿงต Seguro para subprocesos: El mรณdulo de cola gestiona el bloqueo, de modo que varios hilos pueden compartir una cola de forma segura.
  • ๐ŸŽฏ Prioridad: PriorityQueue libera los elementos por prioridad en lugar de por orden de inserciรณn.
  • ๐Ÿค– Ayuda de IA: Los asistentes de IA generan cรณdigo de cola y explican las ventajas y desventajas de los mรฉtodos FIFO y LIFO a partir de una instrucciรณn sencilla.

Python Cola FIFO LIFO

ยฟQuรฉ es Python ยฟCola?

Una cola es un contenedor que contiene datos. Los datos que se ingresan primero se eliminarรกn primero y, por lo tanto, una cola tambiรฉn se denomina "Primero en entrar, primero en salir" (FIFO). La cola tiene dos extremos delante y detrรกs. Los artรญculos se introducen por la parte trasera y se retiran por la parte delantera.

ยฟCรณmo Python ยฟTrabajo en cola?

La cola se puede comparar fรกcilmente con el ejemplo del mundo real: la fila de personas esperando en la cola en el mostrador de boletos, la persona que estรฉ primero obtendrรก el boleto primero, seguida por la siguiente persona y asรญ sucesivamente. La misma lรณgica se aplica tambiรฉn a la estructura de datos de la cola.

Aquรญ hay una representaciรณn esquemรกtica de la cola:

Python Trabajo en cola

El Atrรกs representa el punto donde se insertan los elementos dentro de la cola. En este ejemplo, 7 es el valor para eso.

El Frente representa el punto donde se eliminarรกn los elementos de la cola. Si elimina un elemento de la cola, el primer elemento que obtendrรก es 1, como se muestra en la figura.

El รญtem 1 fue el primero en insertarse en la cola, y al retirarlo es el primero en salir. Por lo tanto, la cola se llama PRIMERO EN ENTRAR, PRIMERO EN SALIR (FIFO)

Python Trabajo en cola

En una cola, los elementos se eliminan en orden y no se pueden eliminar en el medio. Simplemente no puede eliminar el elemento 5 al azar de la cola; para hacerlo, deberรก eliminar todos los elementos antes del 5. Los elementos en la cola se eliminarรกn en el orden en que se inserten.

Tipos de cola en Python

Existen principalmente dos tipos de colas en Python:

  • Primero en entrar, primero en salir de la cola: Para esto, el elemento que entre primero serรก el primero en salir. Para trabajar con FIFO, hay que llamar Cola() clase del mรณdulo de cola.
  • รšltimo en entrar, primero en salir de la cola: aquรญ, el elemento que se ingrese en รบltimo lugar serรก el primero en salir. Para trabajar con LIFO, debe llamar LifoQueue() clase del mรณdulo de cola.

Python instalaciรณn de cola

Es muy fรกcil trabajar con cola en Python. Estos son los pasos a seguir para utilizar la cola en su cรณdigo.

Paso 1) Sรณlo tienes que importar el mรณdulo de cola, como se muestra a continuaciรณn:

import queue

El mรณdulo estรก disponible de forma predeterminada con Python y no necesita ninguna instalaciรณn adicional para comenzar a trabajar con la cola. Hay 2 tipos de cola FIFO (primero en entrar, primero en salir) y LIFO (รบltimo en entrar, primero en salir).

Paso 2) Para trabajar con la cola FIFO, llame a la clase Queue usando el mรณdulo de cola importado como se muestra a continuaciรณn:

import queue
q1 = queue.Queue()

Paso 3) Para trabajar con la cola LIFO, llame a la clase LifoQueue() como se muestra a continuaciรณn:

import queue
q1 = queue.LifoQueue()

Mรฉtodos disponibles dentro de las clases Queue y LifoQueue

A continuaciรณn se muestran los mรฉtodos importantes disponibles dentro de las clases Queue y LifoQueue:

  • poner(elemento): Esto colocarรก el elemento dentro de la cola.
  • conseguir(): Esto le devolverรก un artรญculo de la cola.
  • vacรญo(): Devolverรก verdadero si la cola estรก vacรญa y falso si hay elementos presentes.
  • qtamaรฑo(): devuelve el tamaรฑo de la cola.
  • lleno(): devuelve verdadero si la cola estรก llena, falso en caso contrario.

Ejemplo de cola de primero en entrar, primero en salir

En el caso del primero en entrar, primero en salir, el elemento que entre primero serรก el primero en salir.

Agregar un elemento en una cola

Trabajemos en un ejemplo para agregar un elemento a una cola. Para comenzar a trabajar con la cola, primero importe la cola del mรณdulo, como se muestra en el siguiente ejemplo.

Para agregar un elemento, puede utilizar el mรฉtodo put() como se muestra en el ejemplo:

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

De forma predeterminada, el tamaรฑo de la cola es infinito y puede agregarle cualquier cantidad de elementos. En caso de que desee definir el tamaรฑo de la cola, puede hacer lo mismo de la siguiente manera

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.

Salida:

True

Ahora el tamaรฑo de la cola es 5, no tomarรก mรกs de 5 elementos y el mรฉtodo q1.full() devolverรก verdadero. Agregar mรกs elementos no ejecutarรก mรกs el cรณdigo.

Eliminar un elemento de la cola

Para eliminar un elemento de la cola, puede utilizar el mรฉtodo llamado get(). Este mรฉtodo permite elementos de la cola cuando se llama.

El siguiente ejemplo muestra cรณmo eliminar un elemento de la cola.

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

item1 = q1.get()

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

Salida:

The item removed from the queue is  10

Ejemplo de cola de รบltimo en entrar, primero en salir

En el caso de ser el รบltimo en la cola de primeros en salir, el elemento que ingrese รบltimo serรก el primero en salir.

Para trabajar con LIFO, es decir, el รบltimo en la cola de salida, necesitamos importar el mรณdulo de cola y utilizar el mรฉtodo LifoQueue().

Agregar un elemento en una cola

Aquรญ entenderemos cรณmo agregar un elemento a la cola LIFO.

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

Debe utilizar el mรฉtodo put() en LifoQueue, como se muestra en el ejemplo anterior.

Eliminar un elemento de la cola

Para eliminar un elemento de LIFOqueue, puede utilizar el mรฉtodo get().

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

item1 = q1.get()

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

Salida:

The item removed from the LIFO queue is  10

Agregar mรกs de 1 elemento en una cola

En los ejemplos anteriores, hemos visto cรณmo agregar un solo elemento y eliminarlo para FIFO y LIFOqueue. Ahora veremos cรณmo agregar mรกs de un elemento y tambiรฉn eliminarlo.

Agregar un elemento en una cola FIFO

import queue
q1 = queue.Queue()

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

Eliminar un elemento de la cola FIFO

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.

Salida:

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

Agregar un elemento en una cola LIFO

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

Eliminar un elemento de LIFOqueue

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.

Salida:

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 

Cola de clasificaciรณn

El siguiente ejemplo muestra la ordenaciรณn de la cola. El algoritmo utilizado para la ordenaciรณn es el de burbuja.

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()

Salida:

3 4 5 10 11 21

Revcola de cambio

Para revertir la cola, puede utilizar otra cola y recursividad.

El siguiente ejemplo muestra cรณmo invertir la cola.

Ejemplo:

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()

Salida:

10 3 21 4 5 11

Preguntas Frecuentes

Una cola funciona segรบn el principio FIFO (primero en entrar, primero en salir), por lo que el elemento mรกs antiguo sale primero, mientras que una pila funciona segรบn el principio LIFO (รบltimo en entrar, primero en salir), donde el elemento mรกs nuevo sale primero. PythonEl mรณdulo de colas ofrece Queue para comportamiento FIFO y LifoQueue para comportamiento de pila.

Sรญ. Las estructuras Queue, LifoQueue y PriorityQueue estรกn diseรฑadas para programas multihilo y gestionan el bloqueo internamente, por lo que muchos hilos productores y consumidores pueden compartir una misma cola sin condiciones de carrera ni datos corruptos.

queue.Queue es seguro para subprocesos y estรก diseรฑado para la arquitectura productor-consumidor. collections.deque es una cola de doble extremo de propรณsito general mรกs rรกpida para cรณdigo de un solo subproceso, que admite adiciones y eliminaciones rรกpidas desde ambos extremos.

Una PriorityQueue libera los elementos en orden de prioridad en lugar de en orden de inserciรณn. Se colocan tuplas (prioridad, datos) y get() devuelve primero el nรบmero de prioridad mรกs bajo, lo que resulta adecuado para planificadores y algoritmos de ruta mรกs corta.

Por defecto, get() se bloquea y espera hasta que haya un elemento disponible. Pase block=False o use get_nowait() para generar la excepciรณn queue.Empty inmediatamente en lugar de esperar a que haya un nuevo elemento.

Pasa maxsize al constructor, por ejemplo, queue.Queue(5). Cuando la cola estรฉ llena, put() se bloquea hasta que se libere espacio y full() devuelve True. Un maxsize de 0 significa una cola ilimitada.

Los asistentes de IA generan cรณdigo para colas de productor-consumidor, explican las ventajas y desventajas de FIFO frente a LIFO, y sugieren si queue.Queue, deque o asyncio.Queue se ajustan a tu caso. Tambiรฉn ayudan a detectar interbloqueos y llamadas a task_done() faltantes.

Sรญ. GitHub Copilot autocompleta la configuraciรณn de la cola, los bucles put() y get(), y los hilos de trabajo a partir de un comentario. Las herramientas de IA de Agentic van mรกs allรก, refactorizando el cรณdigo bloqueante a asyncio.Queue y agregando manejo de errores en todo el archivo.

Resumir este post con: