En esta sección, te proponemos una serie de proyectos finales que te permitirán aplicar y consolidar los conocimientos adquiridos a lo largo del curso. Estos proyectos están diseñados para desafiar tus habilidades y ayudarte a integrar las diferentes estructuras de datos en soluciones prácticas.
Proyecto 1: Sistema de Gestión de Tareas
Descripción
Desarrolla un sistema de gestión de tareas que permita a los usuarios crear, editar, eliminar y organizar tareas. El sistema debe soportar la priorización de tareas y la categorización en diferentes listas.
Requisitos
- Listas:
- Utiliza listas enlazadas para almacenar las tareas.
- Implementa listas dobles para permitir la navegación hacia adelante y hacia atrás.
- Pilas:
- Usa una pila para implementar una funcionalidad de "deshacer" que permita revertir las últimas acciones realizadas por el usuario.
- Colas:
- Implementa una cola de prioridad para gestionar las tareas según su urgencia.
- Interfaz:
- Crea una interfaz simple (puede ser de consola) para interactuar con el sistema.
Ejemplo de Código
class Tarea:
def __init__(self, descripcion, prioridad):
self.descripcion = descripcion
self.prioridad = prioridad
class Nodo:
def __init__(self, tarea):
self.tarea = tarea
self.siguiente = None
self.anterior = None
class ListaDoblementeEnlazada:
def __init__(self):
self.cabeza = None
self.cola = None
def agregar_tarea(self, tarea):
nuevo_nodo = Nodo(tarea)
if not self.cabeza:
self.cabeza = self.cola = nuevo_nodo
else:
self.cola.siguiente = nuevo_nodo
nuevo_nodo.anterior = self.cola
self.cola = nuevo_nodo
def mostrar_tareas(self):
actual = self.cabeza
while actual:
print(f"Tarea: {actual.tarea.descripcion}, Prioridad: {actual.tarea.prioridad}")
actual = actual.siguiente
# Ejemplo de uso
lista_tareas = ListaDoblementeEnlazada()
lista_tareas.agregar_tarea(Tarea("Estudiar para el examen", 2))
lista_tareas.agregar_tarea(Tarea("Comprar víveres", 1))
lista_tareas.mostrar_tareas()Ejercicio
- Implementa las funcionalidades de edición y eliminación de tareas.
- Añade la funcionalidad de "deshacer" utilizando una pila.
- Implementa la cola de prioridad para gestionar las tareas según su urgencia.
Proyecto 2: Sistema de Navegación GPS
Descripción
Desarrolla un sistema de navegación GPS que permita a los usuarios encontrar la ruta más corta entre dos puntos en una ciudad. El sistema debe soportar la búsqueda de rutas y la visualización de los caminos.
Requisitos
- Grafos:
- Representa la ciudad como un grafo, donde los nodos son ubicaciones y las aristas son caminos entre ellas.
- Algoritmos de Caminos Mínimos:
- Implementa el algoritmo de Dijkstra para encontrar la ruta más corta entre dos ubicaciones.
- Interfaz:
- Crea una interfaz simple (puede ser de consola) para que el usuario ingrese las ubicaciones de inicio y destino.
Ejemplo de Código
import heapq
class Grafo:
def __init__(self):
self.vertices = {}
def agregar_vertice(self, vertice):
self.vertices[vertice] = []
def agregar_arista(self, desde, hasta, peso):
self.vertices[desde].append((hasta, peso))
self.vertices[hasta].append((desde, peso))
def dijkstra(self, inicio):
distancias = {vertice: float('infinity') for vertice in self.vertices}
distancias[inicio] = 0
cola_prioridad = [(0, inicio)]
while cola_prioridad:
distancia_actual, vertice_actual = heapq.heappop(cola_prioridad)
if distancia_actual > distancias[vertice_actual]:
continue
for vecino, peso in self.vertices[vertice_actual]:
distancia = distancia_actual + peso
if distancia < distancias[vecino]:
distancias[vecino] = distancia
heapq.heappush(cola_prioridad, (distancia, vecino))
return distancias
# Ejemplo de uso
ciudad = Grafo()
ciudad.agregar_vertice("A")
ciudad.agregar_vertice("B")
ciudad.agregar_vertice("C")
ciudad.agregar_arista("A", "B", 1)
ciudad.agregar_arista("B", "C", 2)
ciudad.agregar_arista("A", "C", 4)
distancias = ciudad.dijkstra("A")
print(distancias)Ejercicio
- Añade más ubicaciones y caminos a la representación del grafo.
- Implementa una funcionalidad para mostrar la ruta más corta entre dos ubicaciones específicas.
- Mejora la interfaz para que sea más amigable y permita una mejor interacción con el usuario.
Proyecto 3: Sistema de Gestión de Inventarios
Descripción
Desarrolla un sistema de gestión de inventarios para una tienda. El sistema debe permitir agregar, eliminar y buscar productos en el inventario.
Requisitos
- Árboles Binarios de Búsqueda:
- Utiliza un árbol binario de búsqueda (BST) para almacenar y gestionar los productos del inventario.
- Operaciones Básicas:
- Implementa las operaciones de inserción, eliminación y búsqueda en el BST.
- Interfaz:
- Crea una interfaz simple (puede ser de consola) para interactuar con el sistema.
Ejemplo de Código
class Nodo:
def __init__(self, clave, valor):
self.clave = clave
self.valor = valor
self.izquierda = None
self.derecha = None
class ArbolBinarioBusqueda:
def __init__(self):
self.raiz = None
def insertar(self, clave, valor):
if not self.raiz:
self.raiz = Nodo(clave, valor)
else:
self._insertar(self.raiz, clave, valor)
def _insertar(self, nodo, clave, valor):
if clave < nodo.clave:
if nodo.izquierda:
self._insertar(nodo.izquierda, clave, valor)
else:
nodo.izquierda = Nodo(clave, valor)
else:
if nodo.derecha:
self._insertar(nodo.derecha, clave, valor)
else:
nodo.derecha = Nodo(clave, valor)
def buscar(self, clave):
return self._buscar(self.raiz, clave)
def _buscar(self, nodo, clave):
if not nodo:
return None
if clave == nodo.clave:
return nodo.valor
elif clave < nodo.clave:
return self._buscar(nodo.izquierda, clave)
else:
return self._buscar(nodo.derecha, clave)
# Ejemplo de uso
inventario = ArbolBinarioBusqueda()
inventario.insertar(101, "Producto A")
inventario.insertar(102, "Producto B")
print(inventario.buscar(101)) # Output: Producto AEjercicio
- Implementa la funcionalidad de eliminación de productos en el BST.
- Añade una funcionalidad para listar todos los productos en el inventario.
- Mejora la interfaz para que sea más amigable y permita una mejor interacción con el usuario.
Conclusión
Estos proyectos finales te permitirán aplicar los conceptos y técnicas que has aprendido a lo largo del curso. No dudes en personalizar y expandir estos proyectos según tus intereses y necesidades. ¡Buena suerte y feliz programación!
Curso de Estructuras de Datos
Módulo 1: Introducción a las Estructuras de Datos
- ¿Qué son las Estructuras de Datos?
- Importancia de las Estructuras de Datos en la Programación
- Tipos de Estructuras de Datos
Módulo 2: Listas
- Introducción a las Listas
- Listas Enlazadas
- Listas Doblemente Enlazadas
- Listas Circulares
- Ejercicios con Listas
Módulo 3: Pilas
- Introducción a las Pilas
- Operaciones Básicas con Pilas
- Implementación de Pilas
- Aplicaciones de las Pilas
- Ejercicios con Pilas
Módulo 4: Colas
- Introducción a las Colas
- Operaciones Básicas con Colas
- Colas Circulares
- Colas de Prioridad
- Ejercicios con Colas
Módulo 5: Árboles
- Introducción a los Árboles
- Árboles Binarios
- Árboles Binarios de Búsqueda
- Árboles AVL
- Árboles B
- Ejercicios con Árboles
Módulo 6: Grafos
- Introducción a los Grafos
- Representación de Grafos
- Algoritmos de Búsqueda en Grafos
- Algoritmos de Caminos Mínimos
- Aplicaciones de los Grafos
- Ejercicios con Grafos
