Saltar al contenido principal

Stack (Pilas): LIFO, implementación con arrays y listas enlazadas

Una pila (Stack) es una estructura de datos lineal que sigue el principio LIFO (Last In, First Out), es decir, el último elemento en entrar es el primero en salir.

Características

  1. Solo permite inserciones y eliminaciones por un extremo, llamado tope (top).
  2. Operaciones fundamentales:
    • push: Inserta un elemento en el tope de la pila.
    • pop: Elimina y devuelve el elemento del tope de la pila.
    • peek (o top): Devuelve el elemento en el tope sin eliminarlo.
    • isEmpty: Verifica si la pila está vacía.

Ejemplo de LIFO

Una pila de platos: el último plato en ponerse es el primero que se retira.

Implementación

Las pilas pueden implementarse de dos maneras:

  1. Usando arrays: Aprovecha los índices del arreglo para insertar o eliminar en el final.
  2. Usando listas enlazadas: Cada nodo contiene un dato y una referencia al siguiente nodo, y el tope se mueve dinámicamente.

Flujo de operaciones LIFO

Representación visual

Ejemplo Técnico

Implementación con arrays:

StackArray.java
public class StackArray<T> {
private Object[] elements;
private int top;
private int capacity;

public StackArray(int size) {
capacity = size;
elements = new Object[size];
top = -1;
}

public void push(T data) {
if (top == capacity - 1) throw new RuntimeException("Stack overflow");
elements[++top] = data;
}

public T pop() {
if (isEmpty()) throw new RuntimeException("Stack underflow");
return (T) elements[top--];
}

public T peek() {
if (isEmpty()) throw new RuntimeException("Stack is empty");
return (T) elements[top];
}

public boolean isEmpty() {
return top == -1;
}
}

Implementación con listas enlazadas:

StackLinkedList.java
class Node<T> {
T data;
Node<T> next;
Node(T data) { this.data = data; }
}

public class StackLinkedList<T> {
private Node<T> top;

public void push(T data) {
Node<T> newNode = new Node<>(data);
newNode.next = top;
top = newNode;
}

public T pop() {
if (isEmpty()) throw new RuntimeException("Stack underflow");
T data = top.data;
top = top.next;
return data;
}

public T peek() {
if (isEmpty()) throw new RuntimeException("Stack is empty");
return top.data;
}

public boolean isEmpty() {
return top == null;
}
}

Aplicaciones Prácticas

  • Navegadores web: Historial de páginas (ir atrás/adelante).
  • Evaluadores de expresiones: Manejo de operadores y operandos.
  • Recursión: La pila del sistema almacena llamadas a funciones.
  • Deshacer/Rehacer: En editores de texto o gráficos.

Buenas prácticas

  • SRP: La pila debe encargarse solo de almacenar y recuperar elementos.
  • Nombres claros: push, pop, peek indican exactamente su propósito.
  • Pruebas unitarias: Validar condiciones de desbordamiento y subdesbordamiento.
  • Abstracción: Las implementaciones (array o lista) pueden cambiar sin afectar la interfaz.

Diagrama de secuencia

  1. El usuario solicita insertar el elemento 10.
  2. El Stack recibe la información y solicita crear un nodo con el valor enviado.
  3. Se crea un nodo con valor 10 y se le informa a la pila.
  4. Dentro de la pila asigna el nuevo nodo como top de la pila.
  5. El usuario solicita insertar el elemento 20.
  6. El Stack recibe la información y solicita crear un nodo con el valor enviado.
  7. Se crea un nodo con valor 20 y se le informa a la pila.
  8. En la pila, el nuevo nodo se enlaza con el nodo anterior mediante una referencia.
  9. Dentro de la pila asigna el nuevo nodo como top de la pila.
  10. El usuario solicita ver el elemento en el tope.
  11. La pila devuelve el valor 20 sin eliminarlo.
  12. El usuario solicita eliminar el elemento en el tope.
  13. Se verifica que la pila no esté vacía.
  14. Se obtiene el valor 20 y se guarda en una nueva variable.
  15. Se actualiza el top al nodo siguiente (10), en otras palabras, se elimina del stack.
  16. Se devuelve el valor eliminado.

Referencias

  • Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2022). Introduction to Algorithms (4th ed.). MIT Press.
  • Weiss, M. A. (2020). Data Structures and Algorithm Analysis in Java (4th ed.). Pearson.
  • McDowell, G. (2016). Cracking the Coding Interview. CareerCup.
  • Python 3
  • Jest