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
enqueueidequeue. - Afegir un mètode
is_emptyper 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: TrueExplicació:
- La classe
Cuautilitza una llista per emmagatzemar els elements. enqueueafegeix un element al final de la llista.dequeueelimina i retorna el primer element de la llista.is_emptycomprova 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
CuaCircularamb una capacitat fixa. - Implementar els mètodes
enqueueidequeue. - Afegir un mètode
is_fullper 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: 4Explicació:
- La classe
CuaCircularutilitza una llista de mida fixa per emmagatzemar els elements. enqueueafegeix un element a la posicióreari actualitza la posició de manera circular.dequeueelimina i retorna l'element a la posiciófronti actualitza la posició de manera circular.is_fullcomprova 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
enqueueidequeue. - 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
CuaDePrioritatutilitza unheapper emmagatzemar els elements amb les seves prioritats. enqueueafegeix un element alheapamb la seva prioritat.dequeueelimina 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
