Implementación de una Pila con Nodos en Python

Clase 17 de 23Curso de Estructuras de Datos Lineales con Python

Contenido del curso

Linked lists

Resumen

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.