Curso de Estructuras de Datos Lineales con Python

Implementación de una Pila con Nodos en Python

Curso de Estructuras de Datos Lineales con Python

Contenido del curso

Linked lists

Implementación de una Pila con Nodos en Python

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.