Pilhas (stacks) e filas (queues)
São duas formas de organizar dados conforme como entram e saem.
Pilha (LIFO)
LIFO = Last In, First Out: o último a entrar é o primeiro a sair, como
uma pilha de pratos. Operações típicas: push (empilhar) e pop (desempilhar).
class Pilha {
constructor() {
this.items = [];
}
push(valor) {
this.items.push(valor);
}
pop() {
return this.items.pop();
}
peek() {
return this.items[this.items.length - 1];
}
get size() {
return this.items.length;
}
}
Fila (FIFO)
FIFO = First In, First Out: o primeiro a entrar é o primeiro a sair, como
uma fila numa loja. Operações: enqueue (enfileirar) e dequeue (desenfileirar).
class Fila {
constructor() {
this.items = [];
}
enqueue(valor) {
this.items.push(valor);
}
dequeue() {
return this.items.shift();
}
get size() {
return this.items.length;
}
}
Na prática, usar
shift()éO(n). Para filas grandes existem implementações mais eficientes, mas esta versão é perfeita para aprender.
Usos reais
- Pilhas: desfazer/refazer, avaliar expressões, percorrer o histórico.
- Filas: tarefas pendentes, impressão, processar mensagens em ordem.
Exemplos
Uma pilha em ação
class Pilha {
constructor() { this.items = []; }
push(valor) { this.items.push(valor); }
pop() { return this.items.pop(); }
peek() { return this.items[this.items.length - 1]; }
get size() { return this.items.length; }
}
const historico = new Pilha();
historico.push("pagina1");
historico.push("pagina2");
console.log("Elementos:", historico.size); // 2
console.log("Voltar para:", historico.pop()); // pagina2
console.log("Voltar para:", historico.pop()); // pagina1