Módulo 3 - Filas: o primeiro a chegar é o primeiro a sair

Pilha ou fila: escolhendo a estrutura certa

9 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 12/07/2026

O que você vai aprender

  • Escolher entre pilha e fila a partir do que o problema exige.
  • Associar desfazer, histórico e recursão à pilha (LIFO).
  • Associar atendimento justo, impressão e busca em largura à fila (FIFO).
  • Reconhecer que BFS usa fila e DFS usa pilha nos percursos de grafos.

A pergunta que decide

Depois de aprender pilha e fila, o passo de projetista é saber escolher entre elas. E a escolha não é sobre qual é melhor, porque nenhuma é melhor em geral. É sobre qual comportamento o problema pede. Existe uma pergunta única que quase sempre decide: o problema quer atender o elemento mais recente ou o mais antigo? Se ele quer voltar ao que aconteceu por último, desfazer a última ação, retomar de onde parou, a resposta é a pilha, porque ela devolve o último que entrou. Se ele quer respeitar a ordem em que as coisas chegaram, atender quem esperou mais, processar na sequência, a resposta é a fila, porque ela devolve o primeiro que entrou.

Os exemplos ajudam a fixar. O botão desfazer de um editor guarda as ações numa pilha: a última coisa que você fez é a primeira a ser desfeita, comportamento LIFO puro. O botão voltar do navegador é a mesma ideia: você volta primeiro para a página mais recente. Já a impressora compartilhada usa fila: imprime na ordem em que os documentos chegaram, sem privilegiar ninguém. O suporte que atende clientes por ordem de mensagem usa fila. Sempre que você bate o olho num problema e pensa último ou mais recente, pense pilha; quando pensa primeiro, mais antigo ou justo, pense fila.

Comparação lado a lado. À esquerda, uma pilha vertical de blocos com entrada e saída pelo topo e o rótulo Pilha LIFO, com os exemplos desfazer, voltar e recursão. À direita, uma fila horizontal de blocos com entrada pelo fim e saída pela frente e o rótulo Fila FIFO, com os exemplos impressão, atendimento e busca em largura. No centro, a pergunta o mais recente ou o mais antigo?
Pilha atende o mais recente (desfazer, voltar); fila atende o mais antigo (impressão, atendimento).

Duas estruturas, dois percursos de grafo

A escolha entre pilha e fila fica ainda mais concreta quando se olha para os percursos de grafos, que você estuda mais à frente no curso. Para explorar um mapa de pontos conectados, existem duas estratégias clássicas. A busca em largura visita os pontos por camadas, os mais próximos primeiro, e para isso usa uma fila: os vizinhos vão para o fim e são visitados na ordem em que foram descobertos. A busca em profundidade mergulha o mais fundo possível por um caminho antes de voltar, e para isso usa uma pilha: o último ponto descoberto é o próximo a ser explorado, e quando o caminho acaba, ela volta ao anterior. É o exemplo mais elegante de como a estrutura escolhida muda o comportamento inteiro do algoritmo.

// Mesma exploração, estruturas diferentes:
// Busca em largura (BFS) usa FILA -> visita por camadas
fronteira <- fila_vazia()
enfileirar(fronteira, inicio)
// ... a cada passo: desenfileira a FRENTE (o mais antigo)

// Busca em profundidade (DFS) usa PILHA -> mergulha fundo
fronteira <- pilha_vazia()
empilhar(fronteira, inicio)
// ... a cada passo: desempilha o TOPO (o mais recente)

Trocar a fila por uma pilha muda a busca de por camadas (BFS) para em profundidade (DFS). A estrutura define o percurso.

🎮 Jogo da aula

Pilha ou fila para cada caso?

Classifique cada situação na estrutura mais adequada: pilha, que atende o último a chegar, ou fila, que atende o primeiro.

Escolher a estrutura é pensar como projetista

Escolher entre pilha e fila é um exemplo pequeno de uma habilidade grande: casar a estrutura de dados com o problema, em vez de sair codificando. Um bom programador, antes de escrever a solução, pergunta que forma o dado tem e que comportamento o problema exige. As duas estruturas deste começo de curso já treinam esse olhar, e o padrão se repete com as próximas: a lista ligada, a árvore, o grafo, a tabela hash. Cada uma resolve bem um tipo de problema e mal os outros. Reconhecer a pilha e a fila escondidas num enunciado, como você fez nesta aula, é o primeiro passo para projetar soluções em vez de só remendar código.

Teste rápido

Um editor precisa de um botão desfazer, que sempre reverte a última ação feita primeiro. Qual estrutura é a certa?

Perguntas frequentes

Qual é a pergunta mais rápida para escolher entre pilha e fila?
O problema quer o elemento mais recente ou o mais antigo? Se quer o último que chegou (desfazer, voltar, retomar), é pilha. Se quer o primeiro que chegou (atender por ordem, imprimir na sequência, ser justo), é fila. Essa única pergunta resolve a maioria dos casos sem precisar de mais análise.
Por que o botão desfazer usa pilha e não fila?
Porque desfazer precisa reverter a última ação primeiro. Você digita, formata, apaga; ao desfazer, quer voltar o apagar antes do formatar. Isso é LIFO: o último a entrar é o primeiro a sair, o comportamento da pilha. Uma fila desfaria a ação mais antiga primeiro, o que seria o oposto do esperado.
Por que a busca em largura usa fila e a em profundidade usa pilha?
A busca em largura quer visitar os pontos mais próximos primeiro, então guarda os descobertos numa fila e atende na ordem de descoberta (FIFO), avançando por camadas. A busca em profundidade quer mergulhar fundo por um caminho, então usa uma pilha e sempre explora o ponto descoberto mais recente (LIFO), voltando quando o caminho acaba.
Existe problema que dá para resolver com as duas?
Existe, mas o resultado muda. Explorar um grafo funciona com fila ou com pilha, só que a fila dá uma busca em largura e a pilha dá uma em profundidade, com ordens de visita diferentes. Nesses casos, a escolha depende do que você quer: caminho mais curto em passos pede fila; ir fundo por um ramo pede pilha.
A fila de prioridade entra nessa escolha também?
Entra, como uma terceira opção. Se a ordem de saída depende de urgência, e não só de chegada ou de recência, a fila de prioridade é a escolha. O guia mental fica: recência pede pilha, cronologia justa pede fila, e importância variável pede fila de prioridade. Cada uma para um tipo de ordem.
Escolher a estrutura antes de codar vale a pena mesmo?
Vale muito. Escolher a estrutura errada leva a código complicado que luta contra o problema; escolher a certa deixa a solução quase óbvia. Parar um minuto para perguntar que forma o dado tem e que ordem o problema exige poupa horas de remendo depois. É a diferença entre projetar e improvisar.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.