🧩 Invertir una cadena con Pilas — Explicación paso a paso

🎯 Objetivo

Invertir una cadena de texto usando una pila en Java. Ejemplo: "abcd""dcba"

🧱 Implementación completa

import java.util.Stack;

public class InversorCadena {

    public String alReves(String entrada) {
        if (entrada == null)
            throw new IllegalArgumentException("La cadena no puede ser nula.");

        Stack<Character> pila = new Stack<>();

        for (char c : entrada.toCharArray())
            pila.push(c);

        StringBuffer invertida = new StringBuffer();

        while (!pila.isEmpty())
            invertida.append(pila.pop());

        return invertida.toString();
    }
}

🧩 Paso 1 — Validar entrada

if (entrada == null)
    throw new IllegalArgumentException("La cadena no puede ser nula.");

📌 Antes de todo, verificamos si la cadena es null. Si lo es, lanzamos una excepción controlada, evitando errores en tiempo de ejecución (NullPointerException).

🧩 Paso 2 — Crear la pila

Stack<Character> pila = new Stack<>();

Creamos una pila vacía que guardará los caracteres de la cadena. Cada push() coloca un carácter encima del anterior.

📊 Ejemplo visual:

Iteración Carácter Contenido de la pila
1 'a' [a]
2 'b' [a, b]
3 'c' [a, b, c]
4 'd' [a, b, c, d]

🧩 Paso 3 — Llenar la pila

for (char c : entrada.toCharArray())
    pila.push(c);

🔹 Convertimos la cadena en un arreglo de caracteres con toCharArray(). 🔹 En cada iteración, apilamos el carácter actual (push).

🧩 Paso 4 — Vaciar la pila (reversar la cadena)

StringBuffer invertida = new StringBuffer();

while (!pila.isEmpty())
    invertida.append(pila.pop());

💡 Cada pop() saca el último carácter insertado, produciendo el orden inverso automáticamente.

🧠 ¿Por qué usamos StringBuffer?

String invertida = "";
while (!pila.isEmpty())
    invertida += pila.pop(); // ❌ ineficiente

🚫 Cada concatenación crea un nuevo objeto String, ya que las cadenas son inmutables en Java.

StringBuffer (o StringBuilder) es mutable y eficiente, ideal cuando manipulamos texto repetidamente.

🧩 Prueba del programa

public class Principal {
    public static void main(String[] args) {
        InversorCadena inversor = new InversorCadena();
        String resultado = inversor.alReves("abcd");
        System.out.println(resultado);
    }
}

🖥️ Salida esperada:

dcba

🧪 Casos límite

// Cadena vacía
System.out.println(inversor.alReves("")); // ok → ""

// Cadena nula
System.out.println(inversor.alReves(null)); // ❌ lanza excepción

📌 Si la cadena está vacía, funciona sin problema. 📌 Si la cadena es null, el método lanza una IllegalArgumentException.

📊 Visualización del proceso

graph TD
subgraph Proceso
A["Entrada: 'abcd'"] -->|"push"| B["[a, b, c, d]"]
B -->|"pop"| C["Salida: 'dcba'"]
end
style A fill:#edf6f9,stroke:#006d77,stroke-width:2px;
style B fill:#ffddd2,stroke:#e29578,stroke-width:2px;
style C fill:#d0f4de,stroke:#386641,stroke-width:2px;

🧩 Resumen

  • Creamos una pila de caracteres.
  • Apilamos todos los caracteres de la cadena.
  • Luego los desapilamos en orden inverso.
  • Usamos StringBuffer por eficiencia.
  • Verificamos que la cadena no sea nula.