FundamentosEstructuras de datos

Pilas y colas

LIFO y FIFO — las dos disciplinas de acceso que estructuran desde el call stack hasta las colas de mensajes.

En esta página

Pilas y colas no son estructuras complejas: son restricciones deliberadas sobre una lista. Justo esa restricción es la que las hace útiles: el código que las usa se vuelve predecible y fácil de razonar.

Pila (stack): LIFO

Last In, First Out — el último en entrar es el primero en salir, como una pila de platos. Operaciones: push (apilar), pop (desapilar) y peek (mirar la cima), todas O(1).

const pila: number[] = [];
pila.push(1);
pila.push(2);
pila.pop(); // 2 — el último que entró

Pruébalo: solo puedes tocar la cima.

Dónde aparece

  • El call stack: cada llamada a función se apila; al retornar, se desapila. Un desbordamiento de pila es literalmente esta estructura llenándose.
  • Deshacer/rehacer en cualquier editor.
  • Validar anidamientos: paréntesis, etiquetas HTML, bloques — lo último que se abre es lo primero que debe cerrarse.
  • Recorridos en profundidad (DFS) de árboles y grafos, tanto con recursión (pila implícita) como con pila explícita.

Cola (queue): FIFO

First In, First Out — el primero en entrar es el primero en salir, como una fila. Operaciones: enqueue (encolar) y dequeue (desencolar).

En JavaScript, Array.prototype.shift() es O(n) porque desplaza todos los elementos; para colas grandes usa una implementación con dos pilas o una lista enlazada:

class Cola<T> {
  private entrada: T[] = [];
  private salida: T[] = [];

  enqueue(x: T) {
    this.entrada.push(x);
  }

  dequeue(): T | undefined {
    if (this.salida.length === 0) {
      while (this.entrada.length) this.salida.push(this.entrada.pop()!);
    }
    return this.salida.pop(); // O(1) amortizado
  }
}

Pruébalo: entra por el final, sale por el frente.

Dónde aparece

  • Colas de tareas y mensajería (RabbitMQ, SQS, BullMQ): procesar trabajo en orden de llegada.
  • El event loop de JavaScript: la cola de macrotareas y microtareas.
  • Recorridos en anchura (BFS): visitar un grafo por niveles.

Variantes que conviene conocer

  • Deque (double-ended queue): inserta y extrae por ambos extremos en O(1).
  • Cola de prioridad: sale primero el elemento más urgente, no el más antiguo; se implementa con un heap.
  • Buffer circular: cola de tamaño fijo sobre un array, sin mover elementos — la base de los buffers de streaming.

La pregunta que decide cuál usar siempre es la misma: ¿en qué orden necesito recuperar lo que guardo? Si la respuesta es “el más reciente”, pila; “el más antiguo”, cola; “el más importante”, cola de prioridad.