Colas: teoría

Una cola es un tipo de estructura de datos que permite agregar elementos únicamente al final y del que se pueden extraer elementos únicamente al principio, como las colas de la vida real.

Las colas son estructuras de datos que reflejan el comportamiento de las filas que encontramos en la vida cotidiana, como las que se forman en el supermercado, el cine o para subir al autobús. En estas situaciones, siempre nos incorporamos al final de la fila y esperamos nuestro turno hasta llegar a la cabeza, que es el primer lugar. De manera análoga, una cola en programación gestiona elementos siguiendo este mismo principio: los nuevos datos se agregan al final y se procesan desde el principio.

Para entender mejor cómo funcionan las colas, podemos pensar en cada elemento como un nodo, similar a los que vimos en las listas enlazadas. De hecho, una cola puede implementarse a partir de una lista enlazada, donde cada nodo apunta al siguiente. La diferencia principal radica en las operaciones que realizamos sobre la estructura. En las colas, no insertamos elementos al principio ni en posiciones intermedias, sino únicamente al final, y siempre procesamos o eliminamos desde la cabeza.

Las operaciones básicas que manejamos en una cola son tres. Primero, encolar, que consiste en introducir un nuevo elemento al final de la cola. Por ejemplo, si recibimos un pedido en una aplicación, lo añadimos al final para que espere su turno. Segundo, consultar, que nos permite obtener el elemento que está en la cabeza de la cola, es decir, el siguiente que debe ser procesado. Y tercero, eliminar, que consiste en retirar el elemento que ya ha sido procesado, siempre desde el principio de la cola.

Para optimizar el manejo de colas, podemos mantener dos punteros: uno que apunte a la cabeza y otro que apunte al final. Esto evita tener que recorrer toda la lista para insertar un nuevo elemento, ya que con el puntero al final podemos añadir directamente el nuevo nodo. De esta forma, la operación de encolar es mucho más eficiente. Esta idea es un paso hacia las listas doblemente enlazadas, aunque en este caso solo necesitamos los punteros a los extremos para gestionar la cola.

Existe también una operación que algunos autores llaman despachar, que combina consultar y eliminar en una sola acción. Esta función extrae el primer elemento de la cola, lo elimina y lo devuelve para que pueda ser procesado inmediatamente. Aunque podemos implementar esta operación fusionando las funciones de consulta y eliminación, es útil tenerla como una operación independiente para simplificar el código y la lógica.

Aunque en este momento nos centramos en colas sencillas, es importante saber que existen otros tipos, como las colas prioritarias, que gestionan los elementos según su prioridad en lugar de solo el orden de llegada. Sin embargo, para comenzar, entender y dominar las colas básicas es fundamental.

En próximos pasos, podemos explorar cómo implementar estas colas en lenguajes como C y Java, aplicando estos conceptos para construir estructuras eficientes y funcionales que nos permitan gestionar datos en orden, tal como lo hacen las filas en la vida real.

Para ilustrar cómo sería la estructura básica de una cola con punteros a cabeza y final, podemos imaginar algo así en pseudocódigo:

class Nodo {
    Object dato;
    Nodo siguiente;
}

class Cola {
    Nodo cabeza;
    Nodo final;

    void encolar(Object dato) {
        Nodo nuevo = new Nodo();
        nuevo.dato = dato;
        nuevo.siguiente = null;
        if (final != null) {
            final.siguiente = nuevo;
        }
        final = nuevo;
        if (cabeza == null) {
            cabeza = nuevo;
        }
    }

    Object consultar() {
        if (cabeza != null) {
            return cabeza.dato;
        }
        return null;
    }

    void eliminar() {
        if (cabeza != null) {
            cabeza = cabeza.siguiente;
            if (cabeza == null) {
                final = null;
            }
        }
    }

    Object despachar() {
        Object dato = consultar();
        eliminar();
        return dato;
    }
}

Con esta estructura, podemos gestionar la cola de manera eficiente, agregando elementos al final y procesándolos desde el principio sin necesidad de recorrer toda la lista para cada operación. Así, las colas se convierten en herramientas muy útiles para controlar el flujo de datos en nuestras aplicaciones.

Lista de reproducción
  1. 1
    Qué son las estructuras de datos
    3 minutos
  2. 2
    Listas enlazadas: Teoría
    12 minutos
  3. 3
    Listas enlazadas en C
    18 minutos
  4. 4
    Listas enlazadas en Java
    17 minutos
  5. 5
    Colas: teoría
    6 minutos
  6. 6
    Colas en C
    12 minutos
  7. 7
    Colas en Java
    10 minutos
  8. 8
    Pilas: teoría
    7 minutos
  9. 9
    Pilas en C
    11 minutos
  10. 10
    Pilas en Java
    10 minutos
  11. 11
    Introducción a los árboles
    11 minutos
  12. 12
    Árboles binarios
    9 minutos
  13. 13
    Árboles binarios de búsqueda (parte 1)
    10 minutos
  14. 14
    Árboles de búsqueda binaria (parte 2)
    8 minutos
  15. 15
    BSTs en C (parte 1)
    13 minutos
  16. 16
    BSTs en C (parte 2)
    8 minutos
  17. 17
    BSTs en C (y parte 3)
    18 minutos
  18. 18
    BSTs en Java (parte 1)
    9 minutos
  19. 19
    BSTs en Java (parte 2)
    11 minutos
  20. 20
    BSTs en Java (parte 3)
    10 minutos
  21. 21
    Árbol desde preorden e inorden
    8 minutos
  22. 22
    Árbol desde inorden y postorden
    8 minutos
  23. 23
    Árboles k-arios
    6 minutos
  24. 24
    Árboles B (parte 1)
    11 minutos
  25. 25
    Árboles B (parte 2)
    20 minutos
  26. 26
    Árboles B (parte 3)
    39 minutos