es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema reside en el hecho de que la instrucción return false se encuentra dentro del bucle forEach interno, no dentro de la función isBalanced 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ón return stack.isEmpty() fuera del bucle, que devuelve true.

    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:

    function isBalanced(string) {
      let stack = new Stack();
      let balanced = true; // variable de bandera
    
      [...string].forEach((char) => {
        let bracket;
        if (char === "[" || char === "(") {
          stack.push(char);
        } else {
          if (stack.isEmpty()) {
            balanced = false; // establecer la bandera si hay un desequilibrio
            return; // salir del forEach
          }
    
          bracket = stack.pop().data;
          console.log(`PAREJA: ${bracket}${char}`);
          if (!((bracket === "[" && char === "]") || (bracket === "(" && char === ")"))) {
            console.log("funcionando");
            balanced = false; // establecer la bandera si hay un desequilibrio
          }
        }
      });
    
      return balanced && stack.isEmpty(); // devolver la bandera y el estado de la pila
    }
    
    let string = "([(a()]])";
    console.log(isBalanced(string)); // false
    

    En esta implementación, la variable de bandera balanced se inicializa como true. Si hay un corchete desequilibrado, la bandera se establece en false y el bucle forEach se sale temprano utilizando return. Al final de la función, la bandera se combina con la verificación stack.isEmpty() utilizando el operador &&, lo cual asegura que ambas condiciones sean true para que la función devuelva true.

Comments are closed.