En aquesta secció, posarem en pràctica els conceptes apresos sobre les cues. Els exercicis estan dissenyats per reforçar la comprensió de les operacions bàsiques, les cues circulars i les cues de prioritat. Cada exercici inclou una explicació detallada i la seva solució.
Exercici 1: Implementació Bàsica d'una Cua
Descripció:
Implementa una cua bàsica utilitzant una llista en Python. La cua ha de suportar les operacions d'enqueue
(afegir un element) i dequeue
(eliminar un element).
Requisits:
- Crear una classe
Cua
. - Implementar els mètodes
enqueue
idequeue
. - Afegir un mètode
is_empty
per comprovar si la cua està buida.
Solució:
class Cua: def __init__(self): self.items = [] def is_empty(self): return len(self.items) == 0 def enqueue(self, item): self.items.append(item) def dequeue(self): if not self.is_empty(): return self.items.pop(0) else: raise IndexError("La cua està buida") # Exemple d'ús cua = Cua() cua.enqueue(1) cua.enqueue(2) cua.enqueue(3) print(cua.dequeue()) # Sortida: 1 print(cua.dequeue()) # Sortida: 2 print(cua.is_empty()) # Sortida: False print(cua.dequeue()) # Sortida: 3 print(cua.is_empty()) # Sortida: True
Explicació:
- La classe
Cua
utilitza una llista per emmagatzemar els elements. enqueue
afegeix un element al final de la llista.dequeue
elimina i retorna el primer element de la llista.is_empty
comprova si la llista està buida.
Exercici 2: Cua Circular
Descripció:
Implementa una cua circular amb una capacitat fixa. La cua ha de suportar les operacions d'enqueue
i dequeue
, i ha de gestionar correctament el desbordament i el subdesbordament.
Requisits:
- Crear una classe
CuaCircular
amb una capacitat fixa. - Implementar els mètodes
enqueue
idequeue
. - Afegir un mètode
is_full
per comprovar si la cua està plena.
Solució:
class CuaCircular: def __init__(self, capacitat): self.capacitat = capacitat self.items = [None] * capacitat self.front = 0 self.rear = -1 self.size = 0 def is_empty(self): return self.size == 0 def is_full(self): return self.size == self.capacitat def enqueue(self, item): if self.is_full(): raise OverflowError("La cua està plena") self.rear = (self.rear + 1) % self.capacitat self.items[self.rear] = item self.size += 1 def dequeue(self): if self.is_empty(): raise IndexError("La cua està buida") item = self.items[self.front] self.items[self.front] = None self.front = (self.front + 1) % self.capacitat self.size -= 1 return item # Exemple d'ús cua = CuaCircular(3) cua.enqueue(1) cua.enqueue(2) cua.enqueue(3) print(cua.dequeue()) # Sortida: 1 cua.enqueue(4) print(cua.dequeue()) # Sortida: 2 print(cua.dequeue()) # Sortida: 3 print(cua.dequeue()) # Sortida: 4
Explicació:
- La classe
CuaCircular
utilitza una llista de mida fixa per emmagatzemar els elements. enqueue
afegeix un element a la posiciórear
i actualitza la posició de manera circular.dequeue
elimina i retorna l'element a la posiciófront
i actualitza la posició de manera circular.is_full
comprova si la cua està plena.
Exercici 3: Cua de Prioritat
Descripció: Implementa una cua de prioritat on cada element té una prioritat associada. Els elements amb prioritat més alta es processen primer.
Requisits:
- Crear una classe
CuaDePrioritat
. - Implementar els mètodes
enqueue
idequeue
. - Els elements s'han d'emmagatzemar en una llista de tuples
(prioritat, element)
.
Solució:
import heapq class CuaDePrioritat: def __init__(self): self.items = [] def is_empty(self): return len(self.items) == 0 def enqueue(self, item, prioritat): heapq.heappush(self.items, (prioritat, item)) def dequeue(self): if self.is_empty(): raise IndexError("La cua està buida") return heapq.heappop(self.items)[1] # Exemple d'ús cua = CuaDePrioritat() cua.enqueue("tarea1", 2) cua.enqueue("tarea2", 1) cua.enqueue("tarea3", 3) print(cua.dequeue()) # Sortida: "tarea2" print(cua.dequeue()) # Sortida: "tarea1" print(cua.dequeue()) # Sortida: "tarea3"
Explicació:
- La classe
CuaDePrioritat
utilitza unheap
per emmagatzemar els elements amb les seves prioritats. enqueue
afegeix un element alheap
amb la seva prioritat.dequeue
elimina i retorna l'element amb la prioritat més alta (menor valor de prioritat).
Conclusió
En aquesta secció, hem treballat amb diferents tipus de cues: cues bàsiques, cues circulars i cues de prioritat. Aquests exercicis han de proporcionar una comprensió sòlida de com implementar i utilitzar cues en diferents contextos. Practicar amb aquests exercicis ajudarà a consolidar els coneixements i a preparar-se per a situacions reals en la programació.
Curs d'Estructures de Dades
Mòdul 1: Introducció a les Estructures de Dades
- Què són les Estructures de Dades?
- Importància de les Estructures de Dades en la Programació
- Tipus d'Estructures de Dades
Mòdul 2: Llistes
- Introducció a les Llistes
- Llistes Enllaçades
- Llistes Doblement Enllaçades
- Llistes Circulars
- Exercicis amb Llistes
Mòdul 3: Piles
- Introducció a les Piles
- Operacions Bàsiques amb Piles
- Implementació de Piles
- Aplicacions de les Piles
- Exercicis amb Piles
Mòdul 4: Cues
- Introducció a les Cues
- Operacions Bàsiques amb Cues
- Cues Circulars
- Cues de Prioritat
- Exercicis amb Cues
Mòdul 5: Arbres
- Introducció als Arbres
- Arbres Binàries
- Arbres Binàries de Cerca
- Arbres AVL
- Arbres B
- Exercicis amb Arbres
Mòdul 6: Grafs
- Introducció als Grafs
- Representació de Grafs
- Algoritmes de Cerca en Grafs
- Algoritmes de Camins Mínims
- Aplicacions dels Grafs
- Exercicis amb Grafs