Implementar una pila o stack en Python usando nodos es una de las formas más elegantes de comprender cómo funciona esta estructura de datos dinámica. A continuación se desglosa paso a paso cómo construirla, qué métodos esenciales necesita y cuándo conviene usar nodos en lugar de arrays.
¿Cómo se inicializa un stack con nodos en Python?
El primer paso es crear un archivo llamado stack.py e importar la clase Node [00:21]. La clase Stack se define con un método constructor que establece dos atributos fundamentales:
- self.top: apunta al elemento que está en la cima del stack, inicialmente es
None porque el stack comienza vacío.
- self.size: indica el tamaño actual, comienza en cero.
Esto convierte al stack en una estructura de datos dinámica, capaz de crecer o decrecer conforme se agregan o retiran elementos [00:40].
python
class Stack:
def init(self):
self.top = None
self.size = 0
¿Qué hacen los métodos push, pop, peek y clear?
¿Cómo agregar elementos con push?
El método push recibe un dato, crea un nodo y lo coloca en la cima del stack [01:02]. Si ya existe un elemento en self.top, el nuevo nodo apunta hacia él mediante next. Después, self.top se actualiza al nodo recién creado y el tamaño incrementa en uno.
python
def push(self, data):
node = Node(data)
if self.top:
node.next = self.top
self.top = node
self.size += 1
¿Cómo remover elementos con pop?
El método pop retira el elemento que está hasta arriba del stack y retorna su valor [01:42]. Primero verifica que exista un elemento en self.top. Si lo hay, guarda el dato, decrementa el tamaño y reposiciona self.top hacia el siguiente nodo. Cuando no queda ningún nodo después, self.top se vuelve None.
python
def pop(self):
if self.top:
data = self.top.data
self.size -= 1
if self.top.next:
self.top = self.top.next
else:
self.top = None
return data
else:
print("El stack está vacío")
Aquí se aplica el principio LIFO (last in, first out): el último elemento en entrar es el primero en salir [03:38].
¿Cómo consultar la cima con peek?
El método peek simplemente retorna el dato del elemento que está en la cima sin removerlo [02:34]. Si el stack está vacío, muestra un mensaje indicándolo.
python
def peek(self):
if self.top:
return self.top.data
else:
print("El stack está vacío")
¿Cómo vaciar el stack con clear?
El método clear utiliza un ciclo while que llama repetidamente a pop mientras exista un elemento en self.top [02:55]. De esta forma se eliminan todos los nodos de manera iterativa.
python
def clear(self):
while self.top:
self.pop()
¿Cuándo usar nodos y cuándo usar arrays para un stack?
Durante la prueba en terminal se agregaron tres elementos: egg, ham y spam usando push [03:12]. Al llamar a pop, salió spam primero porque fue el último en entrar, confirmando el comportamiento LIFO.
La diferencia entre implementar un stack con nodos o con arrays tiene implicaciones prácticas [04:30]:
- Usa arrays cuando conoces de antemano el número máximo de elementos, ya que al crear un array defines su capacidad fija.
- Usa nodos cuando los elementos son pocos y necesitas flexibilidad, porque la estructura crece dinámicamente sin un límite predefinido.
Sin embargo, al igual que con las linked lists, agregar muchos nodos incrementa la complejidad del código [04:40].
El reto propuesto consiste en añadir métodos para buscar un elemento en particular, crear un iterador que recorra el stack, implementar clear de una forma diferente, y finalmente construir una segunda clase stack basada en arrays con herencia, aplicando la misma lógica pero trabajando con índices [05:05]. ¿Se te ocurre otra forma de vaciar un stack sin usar pop repetidamente? Compártelo en los comentarios.