Stacks

🧱 Stacks (Pilas)

Las stacks o pilas son estructuras de datos poderosas que permiten resolver muchos problemas de programación. Podemos usarlas para implementar la función Undo en editores de texto, para analizar la sintaxis en compiladores, o para evaluar expresiones aritméticas como:

\[ 3 + (4 \times 2) - 5 \]

También son esenciales en la navegación de aplicaciones, por ejemplo, los botones “atrás” y “adelante” de un navegador web o de un dispositivo Android pueden implementarse usando pilas.


📚 Analogía: una pila de libros

La mejor forma de comprender una pila es imaginar una pila de libros. Podemos apilar varios libros uno encima del otro, pero solo podemos ver o retirar el libro superior. Si queremos acceder al libro de abajo, debemos retirar los libros superiores uno a uno.

graph TD
    subgraph Stack["📚 Stack (Pila de Libros)"]
      B3["Libro 3 (Top)"]
      B2["Libro 2"]
      B1["Libro 1 (Base)"]
    end
    style B3 fill:#ffcb77,stroke:#d58f00,stroke-width:2px
    style B2 fill:#fefae0,stroke:#b08968
    style B1 fill:#e9edc9,stroke:#b08968

👉 Esta dinámica se conoce como LIFO (Last In, First Out)último en entrar, primero en salir.


🔁 Ejemplo de operaciones básicas

Una pila es una estructura muy simple pero poderosa. Internamente puede implementarse con un array dinámico o una lista enlazada, y soporta las siguientes operaciones:

Operación Descripción Complejidad
push(x) Agrega un elemento al tope de la pila 𝑂(1)
pop() Elimina el elemento del tope 𝑂(1)
peek() Devuelve el elemento superior sin eliminarlo 𝑂(1)
isEmpty() Indica si la pila está vacía 𝑂(1)

⚙️ Funcionamiento dinámico

Veamos el proceso de apilar y desapilar elementos:

sequenceDiagram
    participant Usuario
    participant Pila

    Usuario->>Pila: push(5)
    Pila->>Pila: [5]
    Usuario->>Pila: push(8)
    Pila->>Pila: [5, 8]
    Usuario->>Pila: push(12)
    Pila->>Pila: [5, 8, 12]
    Usuario->>Pila: pop()
    Pila->>Pila: [5, 8]
    Usuario->>Pila: peek() → 8

📌 Observa cómo pop() siempre retira el último elemento insertado.


🌐 Pilas en la navegación web

Los navegadores mantienen un historial de navegación como una pila. Cada vez que visitamos una nueva página, la actual se apila en el historial. Cuando presionamos “atrás”, el navegador ejecuta un pop() para regresar a la anterior.

graph LR
  subgraph Navegación["🌐 Historial del Navegador"]
    A["Página A (Inicio)"] --> B["Página B"]
    B --> C["Página C (Actual)"]
  end

  style A fill:#e0f7fa,stroke:#00796b,stroke-width:2px
  style B fill:#b2ebf2,stroke:#00796b
  style C fill:#80deea,stroke:#00796b

💡 Esto ilustra perfectamente el principio LIFO: la última página visitada es la primera en salir del historial.

  • Las pilas son estructuras LIFO (Last In, First Out).

  • Se pueden implementar con arrays o listas enlazadas.

  • Todas sus operaciones principales (push, pop, peek, isEmpty) tienen complejidad O(1).

  • Son fundamentales en aplicaciones que requieren deshacer acciones, analizar expresiones, o gestionar navegación.

🧠 Introducción a los ejemplos de pilas

En esta sección exploramos de forma práctica cómo funcionan las pilas (stacks) en Java.
Cada archivo incluido a continuación desarrolla un aspecto diferente de esta estructura de datos, permitiendo observar cómo los principios teóricos —inserción y eliminación bajo el esquema LIFO (Last In, First Out)— se traducen en código ejecutable.

El propósito es que el estudiante comprenda no solo la sintaxis, sino la lógica interna de una pila: cómo crece, cómo se vacía y cómo estas operaciones se aplican en problemas reales como la inversión de cadenas o la verificación de expresiones balanceadas.

Los tres ejemplos están organizados de la siguiente manera:

Introduce la clase Stack de Java y las operaciones básicas push, pop, peek y isEmpty.

Muestra un caso de aplicación práctica: invertir una cadena de texto utilizando una pila.

Presenta el algoritmo completo para determinar si una expresión con paréntesis, corchetes o llaves está correctamente balanceada.