En esta sección, vamos a poner en práctica los conceptos aprendidos sobre pilas. Realizaremos una serie de ejercicios que te ayudarán a consolidar tus conocimientos y habilidades en el uso de esta estructura de datos.
Ejercicio 1: Implementar una Pila desde Cero
Enunciado
Implementa una pila utilizando una lista en Python. La pila debe soportar las siguientes operaciones:
push(element)
: Añadir un elemento a la pila.pop()
: Eliminar y devolver el elemento en la cima de la pila.peek()
: Devolver el elemento en la cima de la pila sin eliminarlo.is_empty()
: DevolverTrue
si la pila está vacía, de lo contrarioFalse
.size()
: Devolver el número de elementos en la pila.
Solución
class Pila: def __init__(self): self.items = [] def push(self, element): self.items.append(element) def pop(self): if not self.is_empty(): return self.items.pop() else: return None def peek(self): if not self.is_empty(): return self.items[-1] else: return None def is_empty(self): return len(self.items) == 0 def size(self): return len(self.items) # Ejemplo de uso pila = Pila() pila.push(1) pila.push(2) pila.push(3) print(pila.pop()) # Salida: 3 print(pila.peek()) # Salida: 2 print(pila.size()) # Salida: 2 print(pila.is_empty()) # Salida: False
Explicación
__init__
: Inicializa una lista vacía para almacenar los elementos de la pila.push
: Añade un elemento al final de la lista.pop
: Elimina y devuelve el último elemento de la lista, si la pila no está vacía.peek
: Devuelve el último elemento de la lista sin eliminarlo, si la pila no está vacía.is_empty
: Comprueba si la lista está vacía.size
: Devuelve el número de elementos en la lista.
Ejercicio 2: Verificar una Expresión Balanceada
Enunciado
Escribe una función que verifique si los paréntesis en una expresión están balanceados. La función debe devolver True
si la expresión está balanceada y False
en caso contrario.
Solución
def esta_balanceada(expresion): pila = Pila() for char in expresion: if char in "({[": pila.push(char) elif char in ")}]": if pila.is_empty(): return False top = pila.pop() if not ((top == '(' and char == ')') or (top == '{' and char == '}') or (top == '[' and char == ']')): return False return pila.is_empty() # Ejemplo de uso print(esta_balanceada("()")) # Salida: True print(esta_balanceada("({[()]})")) # Salida: True print(esta_balanceada("({[([)])")) # Salida: False
Explicación
- Recorrido de la expresión: Recorre cada carácter de la expresión.
- Apertura de paréntesis: Si el carácter es un paréntesis de apertura (
(
,{
,[
), se añade a la pila. - Cierre de paréntesis: Si el carácter es un paréntesis de cierre (
)
,}
,]
), se comprueba si la pila está vacía. Si está vacía, la expresión no está balanceada. Si no está vacía, se compara el paréntesis de cierre con el paréntesis de apertura en la cima de la pila. - Resultado final: Al final del recorrido, la pila debe estar vacía para que la expresión esté balanceada.
Ejercicio 3: Invertir una Cadena
Enunciado
Escribe una función que invierta una cadena utilizando una pila.
Solución
def invertir_cadena(cadena): pila = Pila() for char in cadena: pila.push(char) cadena_invertida = "" while not pila.is_empty(): cadena_invertida += pila.pop() return cadena_invertida # Ejemplo de uso print(invertir_cadena("Hola Mundo")) # Salida: "odnuM aloH"
Explicación
- Pushing: Cada carácter de la cadena se añade a la pila.
- Popping: Se extraen los caracteres de la pila y se concatenan para formar la cadena invertida.
Ejercicio 4: Evaluar una Expresión Postfija
Enunciado
Escribe una función que evalúe una expresión postfija (notación polaca inversa).
Solución
def evaluar_postfija(expresion): pila = Pila() for char in expresion.split(): if char.isdigit(): pila.push(int(char)) else: operando2 = pila.pop() operando1 = pila.pop() if char == '+': pila.push(operando1 + operando2) elif char == '-': pila.push(operando1 - operando2) elif char == '*': pila.push(operando1 * operando2) elif char == '/': pila.push(operando1 / operando2) return pila.pop() # Ejemplo de uso print(evaluar_postfija("3 4 + 2 * 7 /")) # Salida: 2.0
Explicación
- Recorrido de la expresión: Recorre cada token de la expresión.
- Operando: Si el token es un número, se añade a la pila.
- Operador: Si el token es un operador, se extraen los dos operandos de la pila, se aplica el operador y el resultado se añade de nuevo a la pila.
- Resultado final: Al final del recorrido, el resultado de la expresión se encuentra en la cima de la pila.
Conclusión
En esta sección, hemos trabajado con varios ejercicios prácticos que te ayudarán a entender mejor cómo funcionan las pilas y cómo pueden ser utilizadas en diferentes contextos. Asegúrate de practicar estos ejercicios y experimentar con tus propias variaciones para reforzar tu comprensión.
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