Què és una Cua?

Una cua és una estructura de dades lineal que segueix el principi FIFO (First In, First Out), és a dir, el primer element que entra és el primer que surt. Les cues són molt útils en situacions on l'ordre d'arribada dels elements és important, com en la gestió de tasques o en la transmissió de dades.

Característiques Principals de les Cues

  1. FIFO (First In, First Out): El primer element afegit a la cua serà el primer a ser eliminat.
  2. Operacions Bàsiques:
    • Enqueue: Afegir un element al final de la cua.
    • Dequeue: Eliminar un element del principi de la cua.
    • Front: Obtenir el primer element de la cua sense eliminar-lo.
    • Rear: Obtenir l'últim element de la cua sense eliminar-lo.
  3. Aplicacions:
    • Gestió de tasques en sistemes operatius.
    • Gestió de processos en sistemes de xarxes.
    • Implementació de buffers en sistemes de transmissió de dades.

Operacions Bàsiques amb Cues

Enqueue (Afegir un Element)

L'operació d'enqueue afegeix un element al final de la cua. Aquesta operació és generalment O(1), ja que només implica afegir un element al final de la llista.

class Cua:
    def __init__(self):
        self.elements = []

    def enqueue(self, element):
        self.elements.append(element)
        print(f"Element {element} afegit a la cua.")

Dequeue (Eliminar un Element)

L'operació de dequeue elimina el primer element de la cua. Aquesta operació també és generalment O(1), ja que només implica eliminar el primer element de la llista.

class Cua:
    def __init__(self):
        self.elements = []

    def enqueue(self, element):
        self.elements.append(element)
        print(f"Element {element} afegit a la cua.")

    def dequeue(self):
        if not self.is_empty():
            element = self.elements.pop(0)
            print(f"Element {element} eliminat de la cua.")
            return element
        else:
            print("La cua està buida.")
            return None

Front (Obtenir el Primer Element)

L'operació de front retorna el primer element de la cua sense eliminar-lo. Aquesta operació és O(1).

class Cua:
    def __init__(self):
        self.elements = []

    def enqueue(self, element):
        self.elements.append(element)
        print(f"Element {element} afegit a la cua.")

    def dequeue(self):
        if not self.is_empty():
            element = self.elements.pop(0)
            print(f"Element {element} eliminat de la cua.")
            return element
        else:
            print("La cua està buida.")
            return None

    def front(self):
        if not self.is_empty():
            return self.elements[0]
        else:
            print("La cua està buida.")
            return None

Rear (Obtenir l'Últim Element)

L'operació de rear retorna l'últim element de la cua sense eliminar-lo. Aquesta operació és O(1).

class Cua:
    def __init__(self):
        self.elements = []

    def enqueue(self, element):
        self.elements.append(element)
        print(f"Element {element} afegit a la cua.")

    def dequeue(self):
        if not self.is_empty():
            element = self.elements.pop(0)
            print(f"Element {element} eliminat de la cua.")
            return element
        else:
            print("La cua està buida.")
            return None

    def front(self):
        if not self.is_empty():
            return self.elements[0]
        else:
            print("La cua està buida.")
            return None

    def rear(self):
        if not self.is_empty():
            return self.elements[-1]
        else:
            print("La cua està buida.")
            return None

Comprovar si la Cua està Buida

És important tenir una funció per comprovar si la cua està buida abans de realitzar operacions com dequeue, front o rear.

class Cua:
    def __init__(self):
        self.elements = []

    def enqueue(self, element):
        self.elements.append(element)
        print(f"Element {element} afegit a la cua.")

    def dequeue(self):
        if not self.is_empty():
            element = self.elements.pop(0)
            print(f"Element {element} eliminat de la cua.")
            return element
        else:
            print("La cua està buida.")
            return None

    def front(self):
        if not self.is_empty():
            return self.elements[0]
        else:
            print("La cua està buida.")
            return None

    def rear(self):
        if not self.is_empty():
            return self.elements[-1]
        else:
            print("La cua està buida.")
            return None

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

Exemple Pràctic

A continuació, es mostra un exemple pràctic d'ús de la classe Cua:

# Crear una cua
cua = Cua()

# Afegir elements a la cua
cua.enqueue(10)
cua.enqueue(20)
cua.enqueue(30)

# Obtenir el primer element
print(f"Primer element: {cua.front()}")  # Output: Primer element: 10

# Obtenir l'últim element
print(f"Últim element: {cua.rear()}")  # Output: Últim element: 30

# Eliminar elements de la cua
cua.dequeue()  # Output: Element 10 eliminat de la cua.
cua.dequeue()  # Output: Element 20 eliminat de la cua.

# Comprovar si la cua està buida
print(f"La cua està buida? {cua.is_empty()}")  # Output: La cua està buida? False

# Eliminar l'últim element
cua.dequeue()  # Output: Element 30 eliminat de la cua.

# Comprovar si la cua està buida
print(f"La cua està buida? {cua.is_empty()}")  # Output: La cua està buida? True

Conclusió

Les cues són una estructura de dades fonamental en la programació, especialment útils en situacions on l'ordre d'arribada dels elements és crucial. Hem vist les operacions bàsiques amb cues i com implementar-les en Python. En els següents temes, explorarem variacions de les cues com les cues circulars i les cues de prioritat, així com les seves aplicacions pràctiques.

© Copyright 2024. Tots els drets reservats