Estrutura de Dados
Pilhas, filas e árvores
Estruturas de dados são formas de organizar e armazenar informações para que possam ser acessadas e modificadas eficientemente. A escolha da estrutura certa pode fazer a diferença entre um algoritmo lento O(n²) e um rápido O(n log n).
As principais estruturas no Java estão no pacote java.util: Array e ArrayList (acesso O(1) por índice), LinkedList (inserção/remoção O(1) nas pontas), HashSet (sem duplicatas, busca O(1)), TreeSet (ordenado, busca O(log n)), HashMap (chave-valor, busca O(1)), Stack (pilha LIFO) e Queue/Deque (fila FIFO).
Para escolher a estrutura certa, pergunte: preciso de ordem de inserção? (List, LinkedHashSet) Preciso de unicidade? (Set) Preciso de acesso por chave? (Map) Preciso de acesso aleatório rápido? (ArrayList) Preciso de inserção eficiente nas pontas? (Deque, LinkedList)
import java.util.*;
// ── Array: tamanho fixo, acesso O(1) ─────────────
int[] numeros = {3, 1, 4, 1, 5};
System.out.println(numeros[2]); // 4
// ── Stack/Pilha (LIFO) ───────────────────────────
Deque<String> pilha = new ArrayDeque<>();
pilha.push("primeiro");
pilha.push("segundo");
pilha.push("terceiro");
System.out.println(pilha.pop()); // "terceiro"
// ── Queue/Fila (FIFO) ────────────────────────────
Queue<String> fila = new LinkedList<>();
fila.offer("A");
fila.offer("B");
fila.offer("C");
System.out.println(fila.poll()); // "A"
// ── Escolha baseada no problema ──────────────────
List<String> lista = new ArrayList<>(); // ordem, duplicatas
Set<String> conjunto = new HashSet<>(); // unicidade
Map<String,Integer> mapa = new HashMap<>(); // chave → valor
// Tabela de complexidades:
// ArrayList.get(i) → O(1)
// LinkedList.add(0,x) → O(1)
// HashSet.contains(x) → O(1)
// TreeSet.contains(x) → O(log n)Memorize: List para sequência ordenada, Set para unicidade, Map para associação chave→valor. Esses três padrões cobrem 90% dos casos do dia a dia.