Implementación de una Pila con Nodos en Python

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

Resumen

¿Cómo crear una pila utilizando nodos en Python?

Las pilas, conocidas también como stacks, son estructuras de datos fundamentales en informática, permitiendo manejar elementos de manera ordenada con el principio de "Last In, First Out" (LIFO). Ahora que ya tienes una comprensión de las características de las pilas, es momento de implementarlas usando nodos, una implementación que, además de interesante, es eficiente y dinámica.

¿Cómo definir la clase Stack?

Para implementar una pila con nodos en Python, primero creamos un archivo denominado stack.py. Esta estructura estará basada en los nodos ya que son conceptos que ya manejas. Estos son los pasos para definir la clase:

class Nodo:
    def __init__(self, data):
        self.data = data
        self.next = None

class Stack:
    def __init__(self):
        self.top = None
        self.size = 0
  • Nodo: Define la estructura básica de un nodo con un dato y una referencia al siguiente nodo.
  • Stack: Inicializa el stack con un top que apunta a None, indicando que está vacío, y un tamaño de 0, dada su naturaleza dinámica.

¿Cómo agregar elementos con el método push?

El método push inserta nuevos elementos en la pila. Al insertar un nodo, necesitamos verificar si ya existe un elemento en la cima:

def push(self, data):
    nodo = Nodo(data)
    if self.top:
        nodo.next = self.top
    self.top = nodo
    self.size += 1
  • Utilizamos un condicional para manejar si la pila ya tiene nodos, reposicionando el top según el nuevo nodo.
  • Aumentamos el tamaño del stack cada vez que se añade un nuevo nodo.

¿Cómo remover elementos con el método pop?

El método pop elimina el elemento en la cima de la pila, devolviendo su valor:

def pop(self):
    if self.top:
        data = self.top.data
        self.top = self.top.next
        self.size -= 1
        return data
    else:
        print("El stack está vacío.")
  • Usamos condiciones para verificar si hay un elemento en la cima.
  • Si existe, extraemos el valor y ajustamos el puntero top al siguiente nodo, decreciendo el tamaño de la pila.

¿Cómo consultar el elemento principal con el método peek?

El método peek permite visualizar el elemento en la cima sin removerlo:

def peek(self):
    if self.top:
        return self.top.data
    else:
        print("El stack está vacío.")
  • Comprueba si top no es None y retorna el dato. En caso contrario, informa que la pila está vacía.

¿Cómo vaciar la pila con el método clear?

Para vaciar la pila y eliminar todos sus elementos utilizamos el método clear:

def clear(self):
    while self.top:
        self.pop()
  • Empleamos un bucle while para llamar a pop iterativamente mientras self.top tenga elementos.

¿Cómo se comportan las operaciones en la pila?

Probando en un entorno interactivo de Python, experimentamos con las operaciones básicas de agregar y remover elementos:

  • Agregar elementos con push: Insertamos alimentos como "egg", "ham", y "spam".
  • Remover con pop: Extraerá "spam" primero siguiendo LIFO.
  • Consultar con peek: Después de algunas operaciones, el peek muestra el siguiente elemento en la cima, ahora "ham".

Esta implementación básica de stack utilizando nodos proporciona flexibilidad en manipulación de datos, aunque implican complejidad si la estructura crece. Cuando cuentes con un límite de elementos conocido, considera arrays debido a su administración más simple por índice. Tu reto será extender estas funcionalidades y explorar otras variantes de pila, enriqueciéndote en el diseño de estructuras de datos. ¡Continúa desarrollando y aprendiendo!