Estructuras de datos en C/C++

La cola circular (circular queue) en C y C++

En esta lección vas a implementar una cola, con la regla primero en entrar, primero en salir, usando un arreglo circular en C y std::queue en C++.

Introducción

La cola (queue) sigue la regla primero en entrar, primero en salir (FIFO). Con un arreglo normal, cada vez que se quita un elemento habría que desplazar los que quedan. La cola circular (circular buffer) resuelve este problema haciendo que los índices vuelvan al principio y reutilizando los huecos liberados.

Puntos importantes

  • Define las condiciones que siempre deben cumplirse (invariantes) antes de escribir las operaciones.
  • Trata los casos de estructura vacía, llena y de fallo al reservar memoria.
  • Evalúa a la vez la complejidad y la gestión de memoria de cada operación.

Mira cómo funciona

Haz enqueue y dequeue para ver que los elementos salen en el mismo orden en que llegaron.

Ejemplos de código C y C++

C
Ejecutar →
main.c
#include <stdio.h>

typedef struct {
    int data[4];
    int head;
    int size;
} Queue;

int push(Queue *queue, int value) {
    if (queue->size == 4) return 0;
    int tail = (queue->head + queue->size) % 4;
    queue->data[tail] = value;
    ++queue->size;
    return 1;
}

int pop(Queue *queue, int *value) {
    if (queue->size == 0) return 0;
    *value = queue->data[queue->head];
    queue->head = (queue->head + 1) % 4;
    --queue->size;
    return 1;
}

int main(void) {
    Queue queue = {{0}, 0, 0};
    int value;
    push(&queue, 7);
    push(&queue, 9);
    pop(&queue, &value);
    printf("%d\n", value);
}
Resultado de la ejecución
7
C++
Ejecutar →
main.cpp
#include <iostream>
#include <queue>

int main() {
    std::queue<int> values;
    values.push(7);
    values.push(9);
    std::cout << values.front() << '\n';
    values.pop();
}
Resultado de la ejecución
7

Comparación entre C y C++

La cola en C guarda la posición del frente head y el número de elementos size. La posición de un elemento nuevo se calcula con el resto de la división (head + size) % 4, así que el índice vuelve automáticamente al principio al llegar al final del arreglo. En C++, std::queue es un adaptador de contenedor (container adapter) que ofrece directamente las operaciones front, push y pop.

C

Los datos (struct) y las operaciones están separados, y la memoria se reserva y se libera a mano.

C++

Las clases y los contenedores protegen la coherencia de los datos y gestionan sus propios recursos.

Ejercicios de práctica

Ejecuta las dos versiones y después modifica el código para ver la diferencia de seguridad que aporta cada lenguaje.

  • Añade pruebas para el estado vacío y para el momento en que se alcanza la capacidad máxima.
  • Escribe la liberación de la memoria y comprueba que no haya fugas.
  • Compara la complejidad con la del contenedor equivalente de la biblioteca estándar.

Practica con un reto

Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.

Todos los retos