Stack y Queue
Stack (pila, LIFO: Last In First Out) es como una pila de platos: el último que pones es el primero que sacas. Se usa para: historial de navegación (el botón "atrás"), deshacer operaciones (Ctrl+Z), evaluación de expresiones matemáticas, y el call stack del propio lenguaje (cómo las funciones se llaman entre sí).
Queue (cola, FIFO: First In First Out) es como una fila de banco: el primero en llegar es el primero en ser atendido.
La aplicación más importante de Stack en entrevistas es el problema de paréntesis balanceados: verificar que "[{()}]" esté correctamente cerrado. La solución: recorre el string, cuando encuentras apertura empuja al stack, cuando encuentras cierre verifica que el tope del stack sea la apertura correspondiente. Si al final el stack está vacío, los paréntesis están balanceados. Queue es fundamental para BFS (Breadth-First Search), que encuentra el camino más corto en grafos sin pesos.
// Stack (LIFO - Last In First Out)
class Stack {
#items = [];
push(item) { this.#items.push(item); }
pop() { return this.#items.pop(); }
peek() { return this.#items.at(-1); }
isEmpty() { return this.#items.length === 0; }
get size() { return this.#items.length; }
}
// Problema clásico: Paréntesis balanceados
function parentesisBalanceados(str) {
const stack = [];
const pares = { ")": "(", "}": "{", "]": "[" };
for (const c of str) {
if ("({[".includes(c)) {
stack.push(c);
} else if (")]}" .includes(c)) {
if (stack.pop() !== pares[c]) return false;
}
}
return stack.length === 0;
}
console.log(parentesisBalanceados("{[()]}")); // true
console.log(parentesisBalanceados("{[(])}")); // false
// Queue (FIFO - First In First Out)
class Queue {
#items = [];
enqueue(item) { this.#items.push(item); }
dequeue() { return this.#items.shift(); }
peek() { return this.#items[0]; }
isEmpty() { return this.#items.length === 0; }
}
// BFS (Breadth-First Search) con Queue
function bfs(grafo, inicio) {
const visitados = new Set([inicio]);
const cola = new Queue();
cola.enqueue(inicio);
const orden = [];
while (!cola.isEmpty()) {
const nodo = cola.dequeue();
orden.push(nodo);
for (const vecino of grafo[nodo]) {
if (!visitados.has(vecino)) {
visitados.add(vecino);
cola.enqueue(vecino);
}
}
}
return orden;
}
Practica esta lección
Resuelve los ejercicios del curso de Algoritmos en la app, gratis y con corrección automática.
Empezar a practicar