Estoy tratando de entender cómo funcionan las pilas a través del código. Ahora, traté de escribir un programa simple de coincidencia de corchetes: escribí la implementación de la lista vinculada y la usé para implementar la pila en JS. La idea es iterar a través de todos los caracteres de la cadena y colocar corchetes abiertos en la pila. Después de esto, si no hay un paréntesis que coincida con el paréntesis superior, la función debería devolver falso. El problema principal es que la declaración if ejecuta todo menos la declaración de retorno.
Entrada: ([(a()]])
Salida deseada: false
function isBalanced(string) { let stack = new Stack(); [...string].forEach(char => { let bracket if (char === '[' || char === '(') { stack.push(char) } else { if (stack.isEmpty()) { return false } bracket = stack.pop().data console.log(`PAIR: ${bracket}${char}`) if (!(bracket === "[" && char === "]") && !(bracket === "(" && char === ")")) { console.log("working") return false } }}); return stack.isEmpty(); } let string = '([(a()]])' console.log(isBalanced(string)) He usado console.log() para verificar si mi declaración funciona y en qué pares funciona.
La salida en la consola se ve así:
PAIR: (a working PAIR: () PAIR: [] PAIR: (] working true Como puede ver, cuando la declaración es verdadera, definitivamente funciona, pero no llama a la declaración de retorno interna (después de la primera salida 'working' , no debería haber más pares en la consola; simplemente false ). ¿Dónde está el problema?
Puede usar Array#every junto con la verificación de longitud de la pila y regresar dentro de la devolución de llamada para cada carácter correcto true .
function isBalanced(string) { const closed = { '(': ')', '[': ']' }, stack = []; return [...string].every(char => { if (char === '[' || char === '(') { stack.push(char); return true; } if (!stack.length) return false; const bracket = stack.pop(); console.log(`PAIR: ${bracket}${char}`); return closed[bracket] === char; }) && !stack.length; } console.log(isBalanced('(([()]))')); console.log(isBalanced('([(a()]])')); .as-console-wrapper { max-height: 100% !important; top: 0; }