Estruturas de Dados: o que são, tipos e quando usar

Estruturas de dados são formas de organizar e armazenar informações na memória do computador para que um programa consiga acessá-las e manipulá-las de maneira eficiente — a escolha certa pode tornar um sistema milhares de vezes mais rápido.

Diagramas de estruturas de dados: pilha, fila, árvore e grafo

Existe uma equação famosa na computação, do cientista Niklaus Wirth: “Algoritmos + Estruturas de Dados = Programas”. Ela resume bem por que esse tema é tão central. Se a lógica e os algoritmos são o raciocínio que resolve o problema, as estruturas de dados são a forma como você organiza as informações que esse raciocínio vai manipular. Escolher a estrutura errada pode deixar um programa lento e travado; escolher a certa o deixa rápido e elegante. Neste guia você vai entender o que são estruturas de dados, os principais tipos (com analogias simples), quando usar cada um e como elas se conectam com a eficiência do seu código.

O que são estruturas de dados?

Uma estrutura de dados é uma forma específica de organizar, armazenar e relacionar dados na memória, de modo a permitir o acesso e a modificação eficientes dessas informações. Em vez de jogar os dados de qualquer jeito, você os arruma segundo um “formato” que facilita as operações que pretende fazer com eles — buscar, inserir, remover, ordenar.

Uma analogia ajuda: pense em como você guarda objetos em casa. Roupas vão numa gaveta ou num cabide; pratos, empilhados no armário; livros, lado a lado na estante. Cada forma de guardar é adequada a um tipo de objeto e a um jeito de pegá-lo depois.

As estruturas de dados são exatamente isso para a informação: cada uma organiza os dados de um jeito, com vantagens e desvantagens conforme o que você precisa fazer. Elas são um dos pilares de toda programação, ao lado da lógica e dos algoritmos.

Esse tema é o desdobramento natural de quem já entende lógica de programação e algoritmos: a lógica te ensina a pensar em passos, o algoritmo é a sequência desses passos, e as estruturas de dados são como você guarda os dados que o algoritmo processa.

Por que estruturas de dados são importantes?

Pode parecer um detalhe técnico, mas a escolha da estrutura de dados é uma das decisões que mais afetam o desempenho de um sistema. Veja por quê:

  • Eficiência. Buscar um nome em uma lista desorganizada de um milhão de itens pode exigir percorrer todos eles; na estrutura certa, a mesma busca é quase instantânea. A diferença de velocidade é gigantesca quando os dados crescem.
  • Organização. Estruturas de dados dão um “formato” claro à informação, deixando o código mais legível e fácil de manter.
  • Base para algoritmos. Muitos algoritmos só funcionam (ou só são eficientes) sobre uma estrutura específica. Busca binária precisa de dados ordenados; navegação de rotas precisa de grafos.
  • São cobradas no mercado. Estruturas de dados são tema certo em entrevistas técnicas e provas de concurso na área de TI. Dominá-las é quase um pré-requisito para vagas de desenvolvimento.

Estruturas de dados lineares e não lineares

Antes dos tipos, uma divisão importante. As estruturas de dados costumam ser classificadas em dois grandes grupos:

As lineares organizam os elementos em sequência, um após o outro, em que cada elemento tem um antecessor e um sucessor (exceto o primeiro e o último). São os arrays, listas, pilhas e filas. As não lineares organizam os dados de forma hierárquica ou em rede, em que um elemento pode se conectar a vários outros. São as árvores e os grafos. Comece pelas lineares, que são a base; as não lineares vêm naturalmente depois.

Lineares vs. não lineares As lineares organizam os dados em sequência (array, lista, pilha, fila). As não lineares organizam de forma hierárquica ou em rede (árvore, grafo). Comece pelas lineares — são a base, e o resto vem naturalmente depois.

Os principais tipos de estruturas de dados

Vamos ver as estruturas mais importantes, com a analogia, como funcionam e quando usar cada uma.

Array (vetor)
Elementos em posições numeradas (índices). Acesso direto e rápido por posição; tamanho geralmente fixo. Analogia: caixas numeradas.
Lista encadeada
Cada nó aponta para o próximo. Cresce dinamicamente; inserção e remoção fáceis. Analogia: caça ao tesouro, cada pista leva à próxima.
Pilha (LIFO)
Último a entrar, primeiro a sair. Operações: push e pop. Analogia: pilha de pratos; o “desfazer” (Ctrl+Z).
Fila (FIFO)
Primeiro a entrar, primeiro a sair. Operações: enqueue e dequeue. Analogia: fila do banco; fila de impressão.
Árvore
Organização hierárquica: raiz, filhos e folhas. Busca rápida em dados ordenados. Analogia: organograma; pastas do computador.
Grafo
Nós conectados por arestas, em rede, sem hierarquia. Analogia: rede social; rotas de GPS.
Tabela hash
Pares de chave e valor com busca quase instantânea. Analogia: agenda telefônica; dicionários do Python.
Não existe a “melhor”
Existe a mais adequada para cada operação. A escolha depende do que você faz com mais frequência: acessar, inserir, buscar ou ordenar.

Array (vetor)

O array — também chamado de vetor — é a estrutura mais simples e usada. É uma coleção ordenada de elementos, geralmente do mesmo tipo, em que cada um ocupa uma posição identificada por um índice (na maioria das linguagens, começando em 0). Pense numa fileira de caixas numeradas: você acessa qualquer caixa instantaneamente se souber o número dela.

A grande vantagem é justamente esse acesso direto pela posição (muito rápido). A limitação clássica é que o array costuma ter tamanho fixo — em muitas linguagens, você define o tamanho ao criá-lo — e inserir ou remover no meio é custoso, porque exige deslocar os outros elementos.

Quando usar: quando você sabe a quantidade de elementos e precisa de acesso rápido por posição.

Lista (lista encadeada)

A lista resolve a rigidez do array. Numa lista encadeada (linked list), cada elemento — chamado de — guarda o seu valor e uma referência (um “ponteiro”) apontando para o próximo nó da sequência. Em vez de caixas numeradas lado a lado, imagine uma caça ao tesouro: cada pista leva à próxima.

A vantagem é a flexibilidade: a lista cresce e diminui dinamicamente, e inserir ou remover elementos é eficiente, pois basta ajustar as referências, sem deslocar tudo. A desvantagem é que não há acesso direto por índice — para chegar ao décimo elemento, você percorre os nove anteriores. Há ainda a lista duplamente encadeada, em que cada nó aponta para o anterior e o próximo, permitindo percorrer nos dois sentidos.

Quando usar: quando você insere e remove elementos com frequência e não sabe o tamanho de antemão.

Array x Lista encadeada
Array — posições numeradas (índices)
10 25 30 47 índice 0 índice 1 índice 2 índice 3
Lista encadeada — cada nó aponta para o próximo
10 25 30 nulo valor | ponteiro
No array, você acessa qualquer posição direto pelo índice. Na lista, cada nó guarda um valor e um ponteiro para o próximo — por isso ela cresce livremente, mas exige percorrer os nós em ordem.

Pilha (stack)

A pilha segue o princípio LIFO (Last In, First Out — o último a entrar é o primeiro a sair). A analogia perfeita é uma pilha de pratos: você coloca um prato no topo e, quando precisa de um, pega o do topo — o último que foi colocado. Não dá para tirar um prato do meio sem desmontar a pilha.

Ela tem só duas operações principais: push (empilhar, adicionar no topo) e pop (desempilhar, remover do topo). Um exemplo do dia a dia: o botão “voltar” do navegador e o “desfazer” (Ctrl+Z) dos programas funcionam como pilhas — o último estado é o primeiro a ser revertido. Internamente, a pilha também controla as chamadas de funções de um programa.

Quando usar: quando você precisa reverter ações na ordem inversa, como histórico, “desfazer” ou recursão.

Comparação entre pilha (LIFO) e fila (FIFO)

Fila (queue)

A fila segue o princípio FIFO (First In, First Out — o primeiro a entrar é o primeiro a sair). É a fila do banco ou da bilheteria: quem chega primeiro é atendido primeiro; novos elementos entram no fim e a saída acontece no início.

As operações são enqueue (enfileirar, adicionar no fim) e dequeue (desenfileirar, remover do início). Exemplos clássicos: a fila de impressão (o primeiro documento enviado é o primeiro a imprimir) e o gerenciamento de tarefas que aguardam processamento. Há variações úteis, como a fila de prioridade (em que certos elementos “furam a fila”) e a deque (fila de duas pontas, que aceita inserção e remoção nas duas extremidades).

Quando usar: quando a ordem de chegada deve ser respeitada, como em filas de tarefas, mensagens ou atendimento.

Árvore (tree)

A árvore é a primeira estrutura não linear: organiza os dados de forma hierárquica, como um organograma ou uma árvore genealógica. Tem um nó no topo (a raiz), que se conecta a nós filhos, que por sua vez têm seus próprios filhos, e assim por diante até as folhas (nós sem filhos).

A mais comum é a árvore binária, em que cada nó tem no máximo dois filhos. Uma variação importante é a árvore binária de busca, em que os valores menores ficam à esquerda e os maiores à direita de cada nó — o que torna a busca muito rápida. Árvores estão por toda parte: na estrutura de pastas do seu computador, no DOM de uma página web, em bancos de dados e em árvores de decisão de inteligência artificial.

Quando usar: quando os dados têm hierarquia ou quando você precisa de buscas rápidas em dados ordenados.

Diagrama de uma árvore binária com raiz, filhos e folhas

Grafo (graph)

O grafo é a estrutura não linear mais flexível: um conjunto de nós (também chamados de vértices) conectados por arestas, em que qualquer nó pode se ligar a qualquer outro. Diferente da árvore, não há hierarquia nem raiz — é uma rede.

O exemplo mais intuitivo é uma rede social: cada pessoa é um nó, e cada amizade é uma aresta ligando dois nós. Grafos modelam relacionamentos complexos: o GPS calcula rotas tratando ruas e cruzamentos como um grafo; sistemas de recomendação e redes de computadores também os usam.

Quando usar: quando você precisa representar relações e conexões entre elementos, como redes, rotas e recomendações.

Grafo: nós conectados por arestas
Ana Bia Léo Caio Dani aresta
Cada pessoa é um ; cada conexão entre elas é uma aresta. Sem raiz nem hierarquia — qualquer nó pode se ligar a qualquer outro.

Tabela hash (hash table)

A tabela hash (também chamada de tabela de dispersão, dicionário ou mapa) armazena pares de chave e valor e usa uma função especial — a função hash — para calcular, a partir da chave, exatamente onde o valor está guardado. É como uma agenda telefônica: em vez de procurar nome por nome, você vai direto à letra certa.

A grande vantagem é a busca quase instantânea: você acessa um valor pela chave sem percorrer toda a estrutura. É por isso que tabelas hash são uma das estruturas mais usadas na prática — os dicionários do Python e os objetos do JavaScript são, no fundo, tabelas hash.

Quando usar: quando você precisa buscar valores por uma chave de forma muito rápida, como em caches e índices.

Estruturas de dados e a eficiência (notação Big O)

A razão de existirem tantas estruturas é que cada uma é eficiente para certas operações e ineficiente para outras. Medir essa eficiência é o papel da notação Big O, que descreve como o tempo de uma operação cresce conforme o volume de dados aumenta.

Por exemplo: acessar um elemento de um array pela posição é O(1) (instantâneo, não importa o tamanho); buscar um valor numa lista encadeada é O(n) (pode ter que percorrer tudo); buscar numa tabela hash é, em média, O(1). É por isso que não existe estrutura “melhor” no geral — existe a mais adequada para o que você precisa fazer com mais frequência. Para entender a fundo como essa medição funciona, veja a seção sobre Big O no nosso guia de o que é algoritmo.

Como escolher a estrutura de dados certa

A escolha depende das operações que você fará com mais frequência. Algumas perguntas que orientam a decisão: você precisa de acesso rápido por posição? Array. Vai inserir e remover muito, em tamanho variável? Lista. Precisa reverter na ordem inversa? Pilha. A ordem de chegada importa? Fila. Os dados são hierárquicos? Árvore. Há relações em rede entre eles? Grafo. Precisa de busca instantânea por chave? Tabela hash.

Na prática, você raramente implementa essas estruturas do zero — as linguagens modernas já trazem a maioria prontas (as listas e dicionários do Python, os arrays e objetos do JavaScript, o Collections do Java). Mas entender como cada uma funciona por dentro é o que te permite escolher a certa e escrever código eficiente. Se você ainda está montando essa base, comece pelo nosso guia de como aprender programação e pratique com uma linguagem simples como o Python, que tem várias dessas estruturas prontas para usar.

Resumo: qual estrutura usar
Estrutura Princípio Quando usar
ArrayAcesso por índiceTamanho conhecido e acesso rápido por posição
ListaNós encadeadosInserções e remoções frequentes, tamanho variável
PilhaLIFOReverter na ordem inversa: histórico, desfazer, recursão
FilaFIFORespeitar a ordem de chegada: tarefas, mensagens
ÁrvoreHierárquicaDados com hierarquia ou busca rápida ordenada
GrafoRede de nósRelações e conexões: redes, rotas, recomendações
Tabela hashChave → valorBusca instantânea por uma chave: caches, índices

Perguntas frequentes sobre estruturas de dados

O que são estruturas de dados em palavras simples?

São formas de organizar e guardar informações na memória do computador para que um programa as acesse e manipule de maneira eficiente. Cada estrutura organiza os dados de um jeito, com vantagens conforme o que você precisa fazer — buscar, inserir, remover ou ordenar.

Quais são os principais tipos de estruturas de dados?

As mais importantes são: array (vetor), lista encadeada, pilha, fila, árvore, grafo e tabela hash. As quatro primeiras são lineares (organizam os dados em sequência); árvore e grafo são não lineares (hierárquicas ou em rede); a tabela hash organiza pares de chave e valor.

Qual a diferença entre pilha e fila?

A pilha segue o princípio LIFO (o último a entrar é o primeiro a sair), como uma pilha de pratos. A fila segue o FIFO (o primeiro a entrar é o primeiro a sair), como uma fila de banco. A diferença está em qual elemento sai primeiro.

Qual a diferença entre array e lista?

O array tem tamanho geralmente fixo e permite acesso direto a qualquer elemento pela posição (índice), mas inserir e remover no meio é custoso. A lista encadeada cresce dinamicamente e torna a inserção e remoção eficientes, mas não tem acesso direto por índice — é preciso percorrer os elementos.

Qual a diferença entre estrutura de dados e algoritmo?

A estrutura de dados é a forma de organizar e armazenar as informações; o algoritmo é a sequência de passos que processa essas informações. Eles trabalham juntos: o algoritmo opera sobre a estrutura de dados, e a escolha da estrutura afeta diretamente a eficiência do algoritmo.

Preciso aprender estruturas de dados para programar?

Para começar e fazer programas simples, não imediatamente. Mas para escrever código eficiente, passar em entrevistas técnicas e evoluir como programador, sim — estruturas de dados são um conhecimento fundamental. O ideal é dominar primeiro a lógica e os algoritmos, e depois avançar para elas.

Qual estrutura de dados é a mais rápida?

Não existe a “mais rápida” no geral — depende da operação. Um array é o mais rápido para acessar por posição; uma tabela hash é a mais rápida para buscar por chave; uma lista é mais eficiente para inserções e remoções frequentes. A escolha depende do que você faz com mais frequência, e isso se mede com a notação Big O.

Qual estrutura de dados estudar primeiro?

Comece pelas lineares, na ordem: array, lista, pilha e fila. Elas são a base e têm analogias simples (caixas numeradas, pilha de pratos, fila de banco). Depois avance para as não lineares (árvore e grafo) e para a tabela hash. Dominar as lineares torna o resto muito mais fácil.

Pronto para colocar seu código no ar?

Depois de dominar lógica, algoritmos e estruturas de dados, o passo seguinte é publicar seus projetos. Com a Homehost, você hospeda seus sites e aplicações com infraestrutura confiável e suporte em português.

Conhecer os planos

Conclusão

Estruturas de dados são a outra metade da equação que forma todo programa: se os algoritmos são o raciocínio, elas são a forma como você organiza as informações que esse raciocínio manipula. Não existe a melhor estrutura — existe a mais adequada para cada problema, e saber escolher é o que separa um código lento de um código eficiente. Comece entendendo as lineares (array, lista, pilha, fila) com suas analogias do dia a dia, avance para as não lineares (árvore e grafo) e a tabela hash, e relacione tudo com a eficiência (Big O). Com a lógica e os algoritmos como base, as estruturas de dados são o passo que transforma um iniciante em um programador que escreve código de verdade — rápido, organizado e pronto para o mercado.

Este artigo foi útil?

Obrigado pela resposta!
Picture of Gustavo Gallas

Gustavo Gallas

Analista de sistemas, formado pela PUC-Rio. Programador, gestor de redes e diretor da empresa Homehost. Pai do Bóris, seu pet de estimação. Gosta de rock'n'roll, cerveja artesanal e de escrever sobre assuntos técnicos.

Contato: gustavo.blog@homehost.com.br

Ganhe 30% OFF

Indique seu nome e e-mail,e ganhe um cupom de desconto de 30% para sempre na Homehost!