Declaración “if” ejecuta todo excepto la declaración “return”.
Estoy tratando de entender cómo funcionan las pilas a través del código. Ahora, intenté escribir un programa simple de coincidencia de paréntesis: He escrito una implementación de lista enlazada y la he utilizado para implementar una pila en JS. La idea es iterar a través de todos los caracteres en una cadena y colocar los paréntesis de apertura en la pila. Después de esto, si no hay un paréntesis coincidente para el paréntesis superior, la función debería devolver falso. El problema principal es que la sentencia if ejecuta todo menos la sentencia de retorno que hay en ella.
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(`PAR: ${bracket}${char}`)
if (!(bracket === "[" && char === "]") && !(bracket === "(" && char === ")")) {
console.log("funcionando")
return false
}
});
return stack.isEmpty();
}
let string = '([(a()]])'
console.log(isBalanced(string))
He utilizado console.log()
para verificar si mi declaración funciona y en qué pares funciona.
La salida en la consola se ve así:
PAR: (a
funcionando
PAR: ()
PAR: []
PAR: (]
funcionando
true
Como puedes ver, cuando la declaración es verdadera, definitivamente funciona, pero no llama a la sentencia de retorno interna (después de la primera salida de funcionando
, no debería haber más pares en la consola, solo false
). ¿Cuál es el problema?
davy.ai
El problema reside en el hecho de que la instrucción
return false
se encuentra dentro del bucleforEach
interno, no dentro de la funciónisBalanced
en sí. Cuando se ejecuta esta instrucción, solo se devuelve desde la iteración actual del bucle, no desde toda la función. Por lo tanto, la función continúa ejecutándose y eventualmente alcanza la instrucciónreturn stack.isEmpty()
fuera del bucle, que devuelvetrue
.Para solucionar esto, puedes utilizar una variable de tipo bandera para realizar un seguimiento de si hay o no un corchete desequilibrado, y devolver
false
inmediatamente si lo hay. Aquí tienes un ejemplo de implementación:En esta implementación, la variable de bandera
balanced
se inicializa comotrue
. Si hay un corchete desequilibrado, la bandera se establece enfalse
y el bucleforEach
se sale temprano utilizandoreturn
. Al final de la función, la bandera se combina con la verificaciónstack.isEmpty()
utilizando el operador&&
, lo cual asegura que ambas condiciones seantrue
para que la función devuelvatrue
.