Pular para o conteúdo

Estruturas de Dados

Estrutura de dados é o jeito que você organiza informação para o programa trabalhar com ela.

E sim: isso muda muito o resultado final.

A mesma regra pode virar:

  • código limpo e rápido
  • ou um caos cheio de busca lenta, duplicação e remendo

Usar lista para tudo.

Lista resolve muita coisa? Resolve.

Mas não resolve tudo bem.

Quando você usa a estrutura errada, aparecem sintomas clássicos:

  • busca linear em toda tela
  • duplicação de lógica
  • if demais para compensar modelagem ruim
  • performance caindo sem você entender por quê

Boa quando:

  • a ordem importa
  • você percorre os dados em sequência
  • acesso por índice faz sentido

Ruim quando:

  • você precisa achar item por chave o tempo todo
  • remove ou insere no meio com frequência alta

Modelo LIFO: o último que entra é o primeiro que sai.

Use quando o fluxo parece:

  • desfazer ação
  • histórico de navegação
  • parsing
  • chamadas aninhadas

Modelo FIFO: o primeiro que entra é o primeiro que sai.

Use quando o fluxo parece:

  • fila de processamento
  • tarefas pendentes
  • mensagens
  • processamento assíncrono

Use quando você quer:

  • achar rápido por ID
  • relacionar chave → valor
  • evitar varrer lista toda hora

Exemplo:

  • idUsuario -> objetoUsuario

Use quando o ponto principal é:

  • garantir unicidade
  • descobrir se algo já existe

Exemplo:

  • e-mails únicos
  • tags sem repetição
  • IDs já processados

Responde essas perguntas:

  1. O acesso principal será por índice, chave, ordem ou prioridade?
  2. Eu vou buscar muito ou iterar muito?
  3. Preciso impedir duplicidade?
  4. A ordem importa?
  5. Vou processar em sequência?

Só essas perguntas já resolvem boa parte da escolha.

  • quer percorrer em ordem? lista
  • quer achar por chave? map
  • quer unicidade? set
  • quer processamento em fila? queue
  • quer desfazer / voltar? stack

Simples assim.

No mesmo sistema, você pode ter:

  • Array para exibir pedidos em ordem na interface
  • Map para buscar pedido por ID rápido
  • Queue para processar pedidos pendentes
  • Set para impedir reprocessamento do mesmo evento

Repara no ponto importante:

um sistema sério usa mais de uma estrutura ao mesmo tempo.

Você não precisa decorar tudo agora.

Mas precisa sentir a diferença entre:

  • procurar em lista item por item
  • acessar direto por chave

Quando a base cresce, isso muda:

  • tempo de resposta
  • custo de processamento
  • clareza do código

Sinais clássicos:

  • você vive fazendo find, filter, some na mesma coleção
  • toda função precisa “achar” o mesmo item de novo
  • você cria lista paralela pra compensar falta de estrutura
  • precisa de comentário demais para explicar como os dados se relacionam
  • usar lista para lookup por ID
  • duplicar estado em várias estruturas sem estratégia
  • esconder regra de negócio dentro da estrutura
  • expor estrutura bruta em vez de encapsular comportamento

Não basta escolher estrutura boa.

Você também precisa evitar espalhar manipulação dela no projeto inteiro.

Melhor:

  • adicionarPedido(pedido)
  • buscarPedidoPorId(id)
  • marcarPedidoComoProcessado(id)

Pior:

  • cada arquivo mexendo direto no array, set e map
  1. Monte um gerenciador de tarefas com lista e prioridade.
  2. Use Map para acesso por ID.
  3. Use Set para tags únicas.
  4. Use Queue para tarefas pendentes.
  5. Explique em voz alta por que cada estrutura foi escolhida.
  • Você entende diferença entre lista, stack e queue?
  • Você sabe quando map ganha de lista?
  • Você percebe quando set evita bug?
  • Você consegue justificar sua escolha de estrutura?

Se sim, você já começou a pensar como engenheiro, e não só como “quem faz funcionar”.