Pular para o conteúdo

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.

push(1, 2, 3) → Pilha1Pilha → pop() → 32add(1, 2, 3) → Fila3Fila → poll() → 14push(1, 2, 3)push(1, 2, 3)Pilha — topo: 3Pilhatopo: 3pop() → 3 — o últimopop() → 3o últimoadd(1, 2, 3)add(1, 2, 3)Fila — frente: 1Filafrente: 1poll() → 1 — o primeiropoll() → 1o primeiro

Arraste para o lado para ver o diagrama inteiro.

Mesmas entradas, saídas opostas: a pilha devolve o 3 (o último que entrou) e a fila devolve o 1 (o primeiro).

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

✓ ExemploKotlin
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

Exercícios

Responda e confira na hora. Complexidades valem com ou sem espaços, como O(n log n).

  1. 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.

  2. 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.

  3. 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.

ChatGPT Claude Perplexity

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.

Referências

Continue aprendendo

Todos os temas de algoritmos e estruturas de dados →