2016-08-01 61 views
-2

所以我想要在用户输入的.java文件中检查文件的括号,圆括号和花括号是否平衡。并输出“平衡”,如果不是“不平衡”,我有代码全部写出来,但我的stackBalance方法没有正确检查。我被告知它会在任何比赛结束后返回“平衡”输出。循环应该继续,直到没有任何东西需要解析并且堆栈不是空的。基本上我的程序太快(在检查整个堆栈之前)决定“平衡”。但我只是没有看到我搞乱了什么。快速解决将不胜感激!下面的代码:括号检查器实现堆栈

public static String stackBalance(Scanner in){ 
     if(!in.hasNext()){ 
      System.out.println("Nothing to see"); 
      } 
     else{ 
      stack<Character> stack = new stack<Character>(); 
      Boolean istrue = true; 
      String expr = in.next(); 
      for (int i = 0; i < expr.length(); i++) 
       { 
        char c = expr.charAt(i); 
        if (c == '[' || c == '(' || c == '{') 
        { 
         stack.push(c); 
        } 
        if (c == '}' || c == ')' || c == ']') 
        { 
         if (stack.isEmpty()) 
          istrue = false; 

         char last = stack.peek(); 
         if (c == '}' && last == '{' || c == ')' && last == '(' || c == ']' && last == '[') 
          stack.pop(); 
         else 
          istrue = false; 
        } 

       } 
      if (istrue) 
       { 
        System.out.println("File is balanced"); 
       } 
       else 
        System.out.println("File is not balanced"); 


       } 
      return null; 

     } 


    } 
+3

糟糕,难以理解的风格。调试器中的快速转向会告诉你哪里出错的速度比问这里要快。 – duffymo

+1

您第一次检测到不平衡的括号或括号时,您不必继续检查。此外,像'istrue'这样的名称实际上不是很具描述性,它并没有真正说出变量用于什么,它的语义。 –

回答

0

您的程序并不能决定太快,它是不正确决定当一切都结束了。

要看看发生了什么事情考虑这个表达式:

((x+y) 

你的程序将返回true,即使括号显然是不平衡的。这是因为平衡的条件需要包括检查堆栈已被清空:

if (istrue && stack.isEmpty()) { 
    ... // ^^^^^^^^^^^^^^^^^^ 
} else { 
    ... 
}