Menu
Coddy logo textTech

Queue (cola)

Última actualización

Una cola tiene dos extremos activos. Los valores nuevos entran por el final y los valores salen por el frente, así que el que lleva más tiempo esperando es el primero al que se atiende. Eso es FIFO, y es exactamente como se comporta una fila en un mostrador: entrar por detrás y ser atendido por delante es lo que hace justa la espera. Pulsa reproducir arriba y observa cómo los valores entran por un lado y salen por el otro.

Como cada extremo se controla con su propio índice o puntero, las dos operaciones son O(1) y ninguna desplaza el resto de los datos. Por eso las colas están debajo de todo lo que procesa trabajo por orden de llegada: trabajos de impresión, colas de tareas y de mensajes, búferes de peticiones y la búsqueda en anchura, que recorre un grafo nivel a nivel precisamente porque guarda su frontera en una cola. Mueve al final el extremo por el que quitas y lo que tienes es un Stack (pila).

Complejidad temporal y espacial

Para una cola respaldada por un búfer circular o por una lista enlazada, las dos implementaciones estándar:

OperaciónComplejidadNotas
EncolarO(1)Escribe en el final y avanza el índice del final.
DesencolarO(1)Lee en el frente y avanza el índice del frente, sin desplazar nada.
Peek (frente)O(1)Lee el valor del frente sin quitarlo.
BuscarO(n)No es para lo que sirve una cola: tienes que vaciarla para mirar dentro.
EspacioO(n)Un hueco por cada valor en espera.

Paso a paso

PasoQué ocurre
1La cola empieza vacía, con el frente y el final apuntando al mismo hueco.
2Encolar escribe el valor en el final y luego avanza el final una posición.
3Cada encolado posterior cae detrás de los valores que ya están esperando.
4Desencolar lee el valor del frente y luego avanza el frente una posición.
5El valor que devuelve es siempre el que lleva más tiempo esperando.
6Cuando el frente alcanza al final la cola vuelve a estar vacía, y seguir desencolando es un error.

Ejemplo resuelto

Encolando 3, 7, 5 y luego vaciando la cola:

OperaciónCola (del frente al final)Devuelve
enqueue(3)[3]nada
enqueue(7)[3, 7]nada
enqueue(5)[3, 7, 5]nada
dequeue()[7, 5]3, el valor más antiguo
dequeue()[5]7
dequeue()[]5, el valor más nuevo, el último

Cuándo usar una cola

Úsala cuandoEvítala cuando
El trabajo debe atenderse por orden de llegada: colas de tareas, búferes de peticiones, gestores de impresiónNecesitas primero el elemento más reciente, que es un Stack (pila)
Estás explorando nivel a nivel, como hace la búsqueda en anchuraLos elementos deben atenderse por prioridad y no por llegada, donde encaja un heap
Un productor y un consumidor van a velocidades distintas y necesitan un búfer entre ambosNecesitas buscar o indexar en medio de los datos
Quieres inserción y eliminación O(1) sin desplazar elementosLa implementarías desplazando un arreglo en cada desencolado, lo que la vuelve O(n)

Código de Queue

Una implementación limpia y ejecutable de Queue en Python, JavaScript, Java, C++, C. Elige un lenguaje, copia el código o ábrelo ya cargado en el Playground de Coddy.

Código de Queue en Python

Python
1from collections import deque2
3queue = deque()4
5# Enqueue three values at the rear6for value in [3, 7, 5]:7    queue.append(value)8    print(f"enqueue {value} -> {list(queue)}")9
10# Dequeue them from the front: first in, first out11while queue:12    value = queue.popleft()13    print(f"dequeue {value} -> {list(queue)}")14
15print("empty:", len(queue) == 0)
Ejecuta este código en el Playground de Python

Preguntas frecuentes sobre las colas

¿Qué significa FIFO?
Primero en entrar, primero en salir: el valor que lleva más tiempo esperando es el siguiente en ser atendido. La fila de una taquilla es la imagen de cada día. Un Stack (pila) sigue la disciplina contraria, LIFO.
¿Cuál es la diferencia entre una cola y una pila?
Solo el extremo por el que quitas. Las dos añaden por el final en O(1); una cola quita por el frente (FIFO) y una pila quita por el mismo extremo por el que añadió (LIFO). Por lo demás, sus tablas de complejidad son idénticas.
¿Cuáles son las operaciones principales de una cola?
enqueue añade un valor al final, dequeue quita y devuelve el valor del frente, peek (o front) lee el frente sin quitarlo, y is_empty indica si queda algo esperando. Las cuatro son O(1).
¿Por qué desencolar es lento si uso un arreglo normal?
Porque quitar el índice 0 de un arreglo desplaza a la izquierda todos los elementos restantes, lo que hace que cada desencolado sea O(n). Las implementaciones reales lo evitan con un búfer circular que avanza un índice de frente, o con una lista enlazada con un puntero a la cabeza. collections.deque de Python y ArrayDeque de Java lo hacen por ti, mientras que list.pop(0) no.
¿Qué es una cola circular?
Una cola sobre un arreglo de tamaño fijo en la que los índices de frente y de final vuelven a 0 al llegar al extremo. Reutiliza los huecos que liberan los desencolados, así que una cola de capacidad n sigue funcionando indefinidamente en vez de salirse del final del arreglo.
¿Dónde se usan las colas en programas reales?
Colas de tareas y de mensajes entre servicios, gestores de impresión y de trabajos, búferes de peticiones en servidores web, búferes de teclado y de eventos, canalizaciones productor-consumidor, y la búsqueda en anchura, donde la cola es justo lo que hace que el recorrido vaya nivel a nivel.
Coddy programming languages illustration

Domina los algoritmos con Coddy

COMENZAR