括号检查器实现堆栈
问题描述:
所以我想要在用户输入的.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;
}
}
答
您的程序并不能决定太快,它是不正确决定当一切都结束了。
要看看发生了什么事情考虑这个表达式:
((x+y)
你的程序将返回true
,即使括号显然是不平衡的。这是因为平衡的条件需要包括检查堆栈已被清空:
if (istrue && stack.isEmpty()) {
... // ^^^^^^^^^^^^^^^^^^
} else {
...
}
糟糕,难以理解的风格。调试器中的快速转向会告诉你哪里出错的速度比问这里要快。 – duffymo
您第一次检测到不平衡的括号或括号时,您不必继续检查。此外,像'istrue'这样的名称实际上不是很具描述性,它并没有真正说出变量用于什么,它的语义。 –