Casi todo en el software funciona con cantidad. Eso es lo que hacen las estructuras de datos: proporcionan una manera de contener la cantidad. Diferentes estructuras tienen diferentes características de rendimiento.
De lejos, la más encontrada es el Array. Los arrays son tradicionalmente estáticos. Esto significa que su tamaño se conoce de antemano y hay que crear un nuevo array para contener una cantidad mayor. La mayoría de los lenguajes proporcionan un array dinámico de algún tipo: a veces llamado Vector, Lista, ArrayList, etc. Es una estructura de datos que abstrae los detalles de redimensionar un array cuando se necesita. Esto hace que parezca que puedes seguir añadiendo/eliminando elementos sin tener que gestionar la memoria directamente.
Los lenguajes dinámicos como Python, PHP, JavaScript en realidad implementan un array como un DoublyLinkedList bajo el capó, y optimizan para la semántica de array si y sólo si los índices son números secuenciales.
Cuando se utilizan las APIs del sistema de bajo nivel en Windows/Linux te encontrarás a menudo con la necesidad de usar punteros a lo que son obviamente listas enlazadas (en lugar de arrays). En los viejos tiempos, supongo, las listas enlazadas eran preferibles probablemente porque ahorraban memoria en lugar de las grandes asignaciones de memoria que requeriría un array.
La siguiente estructura de datos más común que he encontrado es la pila. Las pilas son increíblemente útiles para dejar migas de pan, rastros de pila, etc.
Y luego diría que la cola. Pero no suelo encontrarme con una Cola en memoria, sino más bien con una Cola de Mensajes para gestionar comunicaciones distribuidas. Estas Colas escriben en el sistema de archivos o en la red en lugar de en la memoria.
Un sistema de archivos en el disco duro, tarjeta flash, CD-ROM, etc son todos árboles. La idea de una jerarquía de carpetas y archivos... es un árbol. Internamente es un árbol B* de algún tipo. Pero técnicamente es un árbol desordenado.
La única vez, fuera de la preparación de la entrevista, que me encontré con un gráfico fue cuando tuve que escribir uno, utilizando un Ordenamiento Topológico, para construir un compilador distribuido de C# para reducir un tiempo de construcción de 49 minutos (para más de 500 proyectos de C#) a 20 segundos. El gráfico rastreaba las dependencias y a qué nivel para poder determinar el nivel de paralelismo y cuándo construir qué, junto con un sistema de archivos distribuido para que los otros nodos no tuvieran que construir la misma dependencia. En los juegos, te encontrarás mucho con los gráficos para definir el camino de los enemigos para encontrarte.