Algoritmos e estruturas de dados · Estruturas de dados · 4 min de leitura
Pilhas e filas
Pilha: o último a entrar é o primeiro a sair (desfazer, navegação, parênteses). Fila: o primeiro a entrar é o primeiro a sair (tarefas, BFS). Ambas com O(1) nas pontas.
Arraste para o lado para ver o diagrama inteiro.
Pilha (LIFO)
Só se mexe no topo: push coloca, pop tira. Está em todo lugar: a pilha de chamadas do programa, o "desfazer" do editor, o botão voltar, a navegação entre telas e a checagem de parênteses balanceados (cada fecha precisa casar com o último abre).
Fila (FIFO)
Entra no fim, sai pela frente. É a fila de tarefas, de mensagens (Kafka, SQS), de impressão — e a estrutura que faz a busca em largura visitar um grafo por níveis.
Qual classe usar
Em Kotlin, ArrayDeque serve para as duas (addLast/removeLast = pilha; addLast/removeFirst = fila), tudo O(1). Evite removeAt(0) num MutableList: desloca o array inteiro. Em Swift, use Deque do pacote Swift Collections; em TypeScript, shift() também é O(n) — para filas grandes, use um índice de leitura.
No código
fun balanceado(s: String): Boolean {
val pares = mapOf(')' to '(', ']' to '[', '}' to '{')
val pilha = ArrayDeque<Char>()
for (c in s) when (c) {
'(', '[', '{' -> pilha.addLast(c)
')', ']', '}' -> if (pilha.removeLastOrNull() != pares[c]) return false
}
return pilha.isEmpty() // sobrou abre sem fecha?
} Cada caractere entra e sai da pilha no máximo uma vez: O(n) de tempo e O(n) de espaço no pior caso.
Em resumo
- Pilha: último a entrar, primeiro a sair.
- Fila: primeiro a entrar, primeiro a sair.
- ArrayDeque faz as duas em O(1).
- removeAt(0) e shift() são O(n).
- Parênteses balanceados = pilha; BFS = fila.
Exercícios
Responda e confira na hora. Complexidades valem com ou sem espaços, como O(n log n).
-
Empilhe 1, 2 e 3 (nessa ordem) e desempilhe uma vez. Qual número sai?
Ver a solução
Resposta: 3. Na pilha sai o último que entrou.
-
Enfileire 1, 2 e 3 e desenfileire uma vez. Qual número sai?
Ver a solução
Resposta: 1. Na fila sai o primeiro que entrou.
-
Para conferir se "(()[])" está balanceada, você usa pilha ou fila?
Ver a solução
Resposta: pilha. Cada fecha precisa casar com o abre mais recente — o topo da pilha.
Perguntar à IA
Monte um prompt pronto sobre Pilhas e filas na sua linguagem e no seu caso, e abra num chat gratuito.
O prompt vai para o site que você escolher. Não cole senhas, tokens nem dados reais de clientes. Para Gemini e outros, copie e cole.