Una estructura de datos es una forma organizada de almacenar y manipular datos en la memoria de la computadora. El objetivo es simple: habilitar acceso y modificación rápida según las necesidades del problema.
Pero acá hay una distinción que importa desde el día uno.
Estructura de Datos vs ADT
Un ADT (Abstract Data Type) define qué operaciones debe soportar una estructura, sin decir nada sobre cómo está implementada. Una estructura de datos es la implementación concreta que hace que ese concepto funcione.
El ADT es la idea. La estructura de datos es el código.
Ejemplo clásico — el ADT Stack define:
push(x)— agregar un elementopop()— quitar el último elementopeek()— ver el tope sin quitarloisEmpty()— consultar si está vacío
Eso es todo. No dice nada sobre si usa un array o una linked list internamente. Podés implementarlo de cualquiera de las dos formas, con trade-offs distintos.
Este principio tiene un nombre en ingeniería de software: programar contra la abstracción, no contra la implementación. En Java es la diferencia entre declarar List<T> (el ADT) en lugar de ArrayList<T> (la implementación) — lo que te permite cambiar la estructura interna sin romper el contrato.
Clasificación por organización lógica
Lineales
Las estructuras lineales organizan los datos de forma secuencial. Cada elemento tiene un predecesor y un sucesor (excepto los extremos).
Ejemplos: Arrays, Listas, Stacks, Queues.
El recorrido es unidireccional o bidireccional, siempre sobre una sola dimensión.
No Lineales
Las estructuras no lineales organizan los datos de forma jerárquica o en red. Un elemento puede tener múltiples predecesores y múltiples sucesores.
Ejemplos: Árboles, Grafos.
El recorrido no es secuencial — podés ir "hacia arriba", "hacia abajo", "hacia la izquierda" o seguir múltiples caminos dependiendo de las conexiones.
Clasificación por gestión de memoria
Esta segunda clasificación se enfoca en la implementación, no en la organización lógica. Una misma estructura puede implementarse de forma estática o dinámica.
Estáticas
El tamaño se define al momento de la declaración y no puede cambiar durante la ejecución del programa.
El ejemplo canónico es el array en Java. Ventaja: acceso garantizado por posición en O(1), almacenamiento contiguo en memoria con excelente cache locality. Desventaja: no crece ni encoge.
Dinámicas
El tamaño puede modificarse durante la ejecución. Se pueden agregar y quitar elementos libremente.
El ejemplo es LinkedList en Java. Ventaja: maneja datos que crecen o decrecen. Desventaja: overhead de memoria por punteros, peor cache locality, acceso secuencial en lugar de directo.
Por qué importa esta distinción
La elección entre una estructura estática y una dinámica, o entre una lineal y una no lineal, no es una decisión técnica abstracta — es una decisión de trade-offs concreta.
Un array estático es la herramienta correcta cuando conocés el tamaño de antemano y necesitás acceso rápido por índice. Una linked list es correcta cuando insertás y eliminás frecuentemente en el medio. Un árbol es correcto cuando necesitás búsqueda eficiente con datos ordenados.
Conocer las estructuras es saber cuándo usar cada herramienta.