cadenas en JavaScript pero orientado al concepto de pilas

 ¡Excelente! Si quieres trabajar con cadenas en JavaScript pero orientado al concepto de pilas (LIFO: Last-In, First-Out), aquí tienes 10 ejercicios que aprovechan operaciones de pilas (push, pop, peek, etc.) para manipular strings:


1. Invertir una cadena usando una pila

Implementa una función que invierta una cadena simulando una pila.

javascript
function invertirConPila(cadena) {
    const pila = [];
    for (let char of cadena) pila.push(char); // Apilar
    let invertida = '';
    while (pila.length > 0) invertida += pila.pop(); // Desapilar
    return invertida;
}
console.log(invertirConPila("hola")); // "aloh"

2. Verificar paréntesis balanceados

Usa una pila para verificar si los paréntesis en una cadena están balanceados.

javascript
function parentesisBalanceados(cadena) {
    const pila = [];
    for (let char of cadena) {
        if (char === '(') pila.push(char);
        else if (char === ')') {
            if (pila.length === 0) return false;
            pila.pop();
        }
    }
    return pila.length === 0;
}
console.log(parentesisBalanceados("(()())")); // true

3. Eliminar caracteres duplicados adyacentes

Usa una pila para eliminar duplicados consecutivos (ej: "aabccba" → "abcba").

javascript
function eliminarDuplicadosAdyacentes(cadena) {
    const pila = [];
    for (let char of cadena) {
        if (pila.length > 0 && pila[pila.length - 1] === char) pila.pop();
        else pila.push(char);
    }
    return pila.join('');
}
console.log(eliminarDuplicadosAdyacentes("aabccbaa")); // "abcba"

4. Simplificar rutas de archivos (como en Unix)

Resuelve rutas como /.././abc//./def/ → /abc/def usando una pila.

javascript
function simplificarRuta(ruta) {
    const partes = ruta.split('/');
    const pila = [];
    for (let parte of partes) {
        if (parte === '..') pila.pop();
        else if (parte !== '' && parte !== '.') pila.push(parte);
    }
    return '/' + pila.join('/');
}
console.log(simplificarRuta("/.././abc//./def/")); // "/abc/def"

5. Evaluar expresiones postfijas (notación polaca inversa)

Evalúa expresiones como "23+5*" (que es (2+3)*5 = 25) usando una pila.

javascript
function evaluarPostfija(expresion) {
    const pila = [];
    for (let token of expresion) {
        if (!isNaN(token)) pila.push(parseInt(token));
        else {
            const b = pila.pop(), a = pila.pop();
            if (token === '+') pila.push(a + b);
            else if (token === '-') pila.push(a - b);
            else if (token === '*') pila.push(a * b);
            else if (token === '/') pila.push(a / b);
        }
    }
    return pila.pop();
}
console.log(evaluarPostfija("23+5*")); // 25

6. Validar etiquetas HTML anidadas

Verifica si las etiquetas de apertura y cierre están correctamente anidadas (ej: <div><p></p></div> → válido).

javascript
function etiquetasHTMLValidas(html) {
    const pila = [];
    const regex = /<\/?([a-z]+)>/g;
    let match;
    while ((match = regex.exec(html)) !== null) {
        const etiqueta = match[1];
        if (match[0][1] !== '/') pila.push(etiqueta); // Apertura
        else {
            if (pila.length === 0 || pila.pop() !== etiqueta) return false;
        }
    }
    return pila.length === 0;
}
console.log(etiquetasHTMLValidas("<div><p></p></div>")); // true

7. Decodificar cadena con patrones repetidos

Decodifica cadenas como "3[a]2[bc]" → "aaabcbc" usando una pila para manejar anidación.

javascript
function decodificarCadena(cadena) {
    const pila = [];
    let num = 0, str = '';
    for (let char of cadena) {
        if (!isNaN(char)) num = num * 10 + parseInt(char);
        else if (char === '[') {
            pila.push({ str, num });
            str = '';
            num = 0;
        } else if (char === ']') {
            const { str: prevStr, num: prevNum } = pila.pop();
            str = prevStr + str.repeat(prevNum);
        } else str += char;
    }
    return str;
}
console.log(decodificarCadena("3[a]2[bc]")); // "aaabcbc"

8. Remover asteriscos y sus caracteres anteriores

Dada una cadena como "ab*c*d", elimina cada * y el carácter anterior (resultado: "d").

javascript
function removerAsteriscos(cadena) {
    const pila = [];
    for (let char of cadena) {
        if (char === '*') pila.pop();
        else pila.push(char);
    }
    return pila.join('');
}
console.log(removerAsteriscos("ab*c*d")); // "d"

9. Construir una cadena con deletions mínimos

Dadas dos cadenas s y t, determina si s puede convertirse en t usando una pila para simular deletions.

javascript
function esSubsecuencia(s, t) {
    const pila = s.split('');
    for (let i = t.length - 1; i >= 0 && pila.length > 0; i--) {
        if (t[i] === pila[pila.length - 1]) pila.pop();
    }
    return pila.length === 0;
}
console.log(esSubsecuencia("abc", "ahbgdc")); // true

10. Simular el editor de texto "Undo" (Ctrl+Z)

Usa dos pilas: una para el texto actual y otra para los cambios deshechos.

javascript
class EditorTexto {
    constructor() {
        this.pila = [];
        this.undoStack = [];
    }
    escribir(char) {
        this.pila.push(char);
    }
    deshacer() {
        if (this.pila.length > 0) this.undoStack.push(this.pila.pop());
    }
    rehacer() {
        if (this.undoStack.length > 0) this.pila.push(this.undoStack.pop());
    }
    getTexto() {
        return this.pila.join('');
    }
}

const editor = new EditorTexto();
editor.escribir('a');
editor.escribir('b');
editor.deshacer();
console.log(editor.getTexto()); // "a"

Conceptos clave aplicados:

  • Pila como estructura LIFO: En todos los ejercicios, la pila ayuda a manejar el orden inverso o anidado.

  • Uso de push y pop: Operaciones básicas para simular la pila.

  • Aplicaciones clásicas: Balanceo de símbolos, inversión, procesamiento de strings.

¿Quieres que profundicemos en algún ejercicio en particular? 🚀

Comentarios

Entradas más populares de este blog

1-valores duplicados en un arreglo

Pseudocódigo de la Máquina Expendedora

Trabajas en una compañía que ofrece seguros de vida y de gastos