Pilas y colas son las estructuras de datos más simples pero más ubicuas en programación. Aparecen desde la gestión del call stack hasta las colas de impresión.
La pila (Stack) — LIFO
El último que entra, el primero que sale. Como una pila de platos.
# Python: list como stack
pila = []
pila.append(1) # push
pila.append(2)
pila.append(3)
print(pila.pop()) # 3 — LIFO
print(pila.pop()) # 2
Casos de uso:
- Call stack: cómo gestiona Python las llamadas a funciones
- Ctrl+Z (deshacer): cada acción se apila, deshacer hace pop
- Validación de paréntesis: verificar que
({[]})está balanceado - DFS en grafos
Ejemplo: validar paréntesis
def validar(s):
pila = []
parejas = {")": "(", "}": "{", "]": "["}
for c in s:
if c in "({[":
pila.append(c)
elif c in ")}]":
if not pila or pila[-1] != parejas[c]:
return False
pila.pop()
return len(pila) == 0
print(validar("({[]})")) # True
print(validar("({[})")) # False
La cola (Queue) — FIFO
El primero que entra, el primero que sale. Como una fila de supermercado.
from collections import deque
cola = deque()
cola.append(1) # enqueue
cola.append(2)
print(cola.popleft()) # 1 — FIFO
¿Por qué deque y no list? list.pop(0) es O(n), deque.popleft() es O(1).
Casos de uso:
- BFS en grafos
- Colas de impresión y procesamiento de requests
- Buffers de streaming
Resumen rápido
| Necesitas… | Usar |
|---|---|
| Procesar en orden inverso | Stack |
| Procesar en orden de llegada | Queue |
| DFS en grafos | Stack |
| BFS en grafos | Queue |
| Historial de acciones | Stack |