En esta sección, pondremos en práctica los conceptos aprendidos sobre colas mediante una serie de ejercicios. Cada ejercicio está diseñado para reforzar tu comprensión y habilidades en la implementación y manipulación de colas. Asegúrate de intentar resolver los ejercicios por tu cuenta antes de consultar las soluciones.
Ejercicio 1: Implementación Básica de una Cola
Descripción: Implementa una cola utilizando una lista en Python. La cola debe soportar las siguientes operaciones:
enqueue(item)
: Añadir un elemento al final de la cola.dequeue()
: Eliminar y devolver el elemento al frente de la cola.is_empty()
: Verificar si la cola está vacía.size()
: Devolver el número de elementos en la cola.
Código:
class Cola: def __init__(self): self.items = [] def enqueue(self, item): self.items.append(item) def dequeue(self): if not self.is_empty(): return self.items.pop(0) else: return None def is_empty(self): return len(self.items) == 0 def size(self): return len(self.items) # Ejemplo de uso cola = Cola() cola.enqueue(1) cola.enqueue(2) cola.enqueue(3) print(cola.dequeue()) # Salida: 1 print(cola.size()) # Salida: 2
Explicación:
__init__
: Inicializa una lista vacía para almacenar los elementos de la cola.enqueue
: Añade un elemento al final de la lista.dequeue
: Elimina y devuelve el primer elemento de la lista (el frente de la cola).is_empty
: DevuelveTrue
si la lista está vacía, de lo contrarioFalse
.size
: Devuelve el número de elementos en la lista.
Ejercicio 2: Cola Circular
Descripción:
Implementa una cola circular utilizando una lista fija de tamaño n
. La cola debe soportar las siguientes operaciones:
enqueue(item)
: Añadir un elemento al final de la cola.dequeue()
: Eliminar y devolver el elemento al frente de la cola.is_empty()
: Verificar si la cola está vacía.is_full()
: Verificar si la cola está llena.size()
: Devolver el número de elementos en la cola.
Código:
class ColaCircular: def __init__(self, n): self.size = n self.items = [None] * n self.front = -1 self.rear = -1 def enqueue(self, item): if self.is_full(): print("La cola está llena") return if self.front == -1: self.front = 0 self.rear = (self.rear + 1) % self.size self.items[self.rear] = item def dequeue(self): if self.is_empty(): print("La cola está vacía") return None item = self.items[self.front] if self.front == self.rear: self.front = -1 self.rear = -1 else: self.front = (self.front + 1) % self.size return item def is_empty(self): return self.front == -1 def is_full(self): return (self.rear + 1) % self.size == self.front def size(self): if self.is_empty(): return 0 elif self.rear >= self.front: return self.rear - self.front + 1 else: return self.size - self.front + self.rear + 1 # Ejemplo de uso cola_circular = ColaCircular(3) cola_circular.enqueue(1) cola_circular.enqueue(2) cola_circular.enqueue(3) print(cola_circular.dequeue()) # Salida: 1 cola_circular.enqueue(4) print(cola_circular.dequeue()) # Salida: 2
Explicación:
__init__
: Inicializa una lista fija de tamañon
y establece los índicesfront
yrear
en-1
.enqueue
: Añade un elemento al final de la cola circular. Si la cola está llena, muestra un mensaje de error.dequeue
: Elimina y devuelve el primer elemento de la cola circular. Si la cola está vacía, muestra un mensaje de error.is_empty
: DevuelveTrue
si la cola está vacía, de lo contrarioFalse
.is_full
: DevuelveTrue
si la cola está llena, de lo contrarioFalse
.size
: Calcula y devuelve el número de elementos en la cola.
Ejercicio 3: Cola de Prioridad
Descripción: Implementa una cola de prioridad donde cada elemento tiene una prioridad asociada. La cola debe soportar las siguientes operaciones:
enqueue(item, priority)
: Añadir un elemento con una prioridad específica.dequeue()
: Eliminar y devolver el elemento con la mayor prioridad.is_empty()
: Verificar si la cola está vacía.size()
: Devolver el número de elementos en la cola.
Código:
import heapq class ColaPrioridad: def __init__(self): self.heap = [] def enqueue(self, item, priority): heapq.heappush(self.heap, (priority, item)) def dequeue(self): if not self.is_empty(): return heapq.heappop(self.heap)[1] else: return None def is_empty(self): return len(self.heap) == 0 def size(self): return len(self.heap) # Ejemplo de uso cola_prioridad = ColaPrioridad() cola_prioridad.enqueue("tarea1", 2) cola_prioridad.enqueue("tarea2", 1) cola_prioridad.enqueue("tarea3", 3) print(cola_prioridad.dequeue()) # Salida: tarea2 print(cola_prioridad.size()) # Salida: 2
Explicación:
__init__
: Inicializa una lista vacía para almacenar los elementos de la cola de prioridad.enqueue
: Añade un elemento a la cola con una prioridad específica utilizandoheapq.heappush
.dequeue
: Elimina y devuelve el elemento con la mayor prioridad utilizandoheapq.heappop
.is_empty
: DevuelveTrue
si la lista está vacía, de lo contrarioFalse
.size
: Devuelve el número de elementos en la lista.
Retroalimentación sobre Errores Comunes
-
Olvidar verificar si la cola está vacía antes de hacer
dequeue
:- Asegúrate de siempre verificar si la cola está vacía antes de intentar eliminar un elemento. Esto evitará errores y excepciones.
-
Confundir los índices
front
yrear
en colas circulares:- Mantén un seguimiento claro de los índices
front
yrear
en colas circulares. Recuerda querear
se mueve hacia adelante al agregar elementos yfront
se mueve hacia adelante al eliminar elementos.
- Mantén un seguimiento claro de los índices
-
No manejar correctamente las prioridades en colas de prioridad:
- Asegúrate de utilizar una estructura de datos adecuada, como un heap, para manejar las prioridades de manera eficiente.
Conclusión
En esta sección, hemos practicado la implementación de diferentes tipos de colas: colas simples, colas circulares y colas de prioridad. Estos ejercicios te ayudarán a comprender mejor cómo funcionan las colas y cómo pueden ser utilizadas en diferentes contextos. Asegúrate de revisar y entender cada solución antes de pasar al siguiente módulo.
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