Els projectes finals són una oportunitat per aplicar tots els conceptes apresos durant el curs d'Estructures de Dades. Aquests projectes estan dissenyats per desafiar-te i ajudar-te a consolidar els teus coneixements mitjançant la resolució de problemes reals. A continuació, es presenten tres projectes finals que cobreixen diferents aspectes de les estructures de dades.

Projecte 1: Gestió d'una Biblioteca

Descripció

Crea un sistema de gestió per a una biblioteca que permeti gestionar llibres, usuaris i préstecs. Aquest sistema ha de permetre les següents operacions:

  1. Afegir, eliminar i cercar llibres.
  2. Afegir, eliminar i cercar usuaris.
  3. Registrar préstecs de llibres als usuaris.
  4. Gestionar la devolució de llibres.

Requisits

  • Utilitza llistes enllaçades per gestionar els llibres i els usuaris.
  • Utilitza una pila per gestionar els llibres retornats recentment.
  • Utilitza una cua per gestionar els llibres en espera de ser prestats.

Exemples de Codi

Llista Enllaçada per Llibres

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None

    def add_book(self, book):
        new_node = Node(book)
        new_node.next = self.head
        self.head = new_node

    def remove_book(self, book):
        temp = self.head
        if temp is not None:
            if temp.data == book:
                self.head = temp.next
                temp = None
                return
        while temp is not None:
            if temp.data == book:
                break
            prev = temp
            temp = temp.next
        if temp == None:
            return
        prev.next = temp.next
        temp = None

    def search_book(self, book):
        current = self.head
        while current:
            if current.data == book:
                return True
            current = current.next
        return False

Pila per Llibres Retornats

class Stack:
    def __init__(self):
        self.stack = []

    def push(self, item):
        self.stack.append(item)

    def pop(self):
        if not self.is_empty():
            return self.stack.pop()
        return None

    def is_empty(self):
        return len(self.stack) == 0

Cua per Llibres en Espera

class Queue:
    def __init__(self):
        self.queue = []

    def enqueue(self, item):
        self.queue.append(item)

    def dequeue(self):
        if not self.is_empty():
            return self.queue.pop(0)
        return None

    def is_empty(self):
        return len(self.queue) == 0

Exercici Pràctic

Implementa les classes LinkedList, Stack i Queue per gestionar els llibres, els llibres retornats i els llibres en espera, respectivament. Prova el teu sistema amb diferents operacions per assegurar-te que funciona correctament.

Projecte 2: Sistema de Gestió de Tasques

Descripció

Desenvolupa un sistema de gestió de tasques que permeti als usuaris crear, eliminar i prioritzar tasques. Aquest sistema ha de permetre les següents operacions:

  1. Afegir, eliminar i cercar tasques.
  2. Prioritzar tasques.
  3. Mostrar les tasques en ordre de prioritat.

Requisits

  • Utilitza una cua de prioritat per gestionar les tasques.
  • Cada tasca ha de tenir un nivell de prioritat associat.

Exemples de Codi

Cua de Prioritat per Tasques

import heapq

class PriorityQueue:
    def __init__(self):
        self.heap = []

    def add_task(self, task, priority):
        heapq.heappush(self.heap, (priority, task))

    def remove_task(self):
        if not self.is_empty():
            return heapq.heappop(self.heap)[1]
        return None

    def is_empty(self):
        return len(self.heap) == 0

    def peek(self):
        if not self.is_empty():
            return self.heap[0][1]
        return None

Exercici Pràctic

Implementa la classe PriorityQueue per gestionar les tasques amb diferents nivells de prioritat. Prova el teu sistema amb diferents operacions per assegurar-te que funciona correctament.

Projecte 3: Navegació en un Mapa

Descripció

Desenvolupa un sistema de navegació que permeti trobar el camí més curt entre dues ubicacions en un mapa. Aquest sistema ha de permetre les següents operacions:

  1. Afegir, eliminar i cercar ubicacions.
  2. Afegir, eliminar i cercar camins entre ubicacions.
  3. Trobar el camí més curt entre dues ubicacions.

Requisits

  • Utilitza un graf per representar el mapa.
  • Implementa l'algoritme de Dijkstra per trobar el camí més curt.

Exemples de Codi

Graf per Representar el Mapa

import heapq

class Graph:
    def __init__(self):
        self.nodes = set()
        self.edges = {}
        self.distances = {}

    def add_node(self, value):
        self.nodes.add(value)
        self.edges[value] = []

    def add_edge(self, from_node, to_node, distance):
        self.edges[from_node].append(to_node)
        self.edges[to_node].append(from_node)
        self.distances[(from_node, to_node)] = distance
        self.distances[(to_node, from_node)] = distance

    def dijkstra(self, initial):
        visited = {initial: 0}
        path = {}

        nodes = set(self.nodes)

        while nodes:
            min_node = None
            for node in nodes:
                if node in visited:
                    if min_node is None:
                        min_node = node
                    elif visited[node] < visited[min_node]:
                        min_node = node

            if min_node is None:
                break

            nodes.remove(min_node)
            current_weight = visited[min_node]

            for edge in self.edges[min_node]:
                weight = current_weight + self.distances[(min_node, edge)]
                if edge not in visited or weight < visited[edge]:
                    visited[edge] = weight
                    path[edge] = min_node

        return visited, path

Exercici Pràctic

Implementa la classe Graph i l'algoritme de Dijkstra per trobar el camí més curt entre dues ubicacions en un mapa. Prova el teu sistema amb diferents operacions per assegurar-te que funciona correctament.

Conclusió

Els projectes finals són una excel·lent manera de posar en pràctica els teus coneixements sobre estructures de dades. Aquests projectes no només t'ajudaran a consolidar els conceptes apresos, sinó que també et proporcionaran experiència en la resolució de problemes reals. Assegura't de completar tots els projectes i de provar les teves solucions amb diferents casos per garantir que el teu sistema funcioni correctament.

© Copyright 2024. Tots els drets reservats