我正在尝试检查表达式是否在括号中是平衡的,我的程序应该输出相应的消息,如下所示:(我正在从文件中读取表达式)
如果每个“)”都有一个“(”那么它是平衡的。 如果有一个“)”没有“(”那么左括号就会丢失,依此类推。
我找出了“(A + B)”的情况下的代码,它打印平衡,但对于“(A + B)”的情况“它打印平衡和左丢失,我似乎无法弄清楚问题是什么
这是代码: (编辑:我把它作为一种方法来处理,当表达式平衡并且当右括号丢失时它可以正常工作,但是如果左边的那个缺失它会打印出“平衡”)问题是当它有一个缺失的时候括号,返回的堆栈是空的,这就是它打印“平衡”的原因。我真的不知道如何解决这个问题!
public static Stack isBalanced(String str) {
Stack s = new Stack();
char temp;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '(') {
s.push(str.charAt(i));
} else if (str.charAt(i) == ')') {
if (!s.isEmpty()) {
temp = (char) s.pop();
}
}
}
return s;
}
答案 0 :(得分:6)
这似乎是一个过于复杂的问题解决方法。您可以通过意识到在这种情况下您只匹配一个可能的对来简化这一点,因此只需简单的计数即可。
只需扫描检查每个字符的字符串即可。增加一个计数器(每个都减少)。
如果计数器低于零,那么你有一个额外的结束括号。如果您完成扫描并且计数器不为零,则您有一个额外的开口括号。
答案 1 :(得分:3)
您每次遇到isEmpty
时都会检查堆栈)
,并在您的计数第一次降至零时打印“平衡”。你应该只在最后进行检查(你还需要确保你从来没有看到堆栈欠载)。
答案 2 :(得分:0)
我已经解决了这个问题,最后我只有一个条件就是检查堆栈是不是空的,并且当堆栈不为空时我没有放入条件,所以如果堆栈碰巧是我将把结束括号推入其中并在主要内容中打印相应的消息(我忘了在上面的代码中添加我的mm)
if (!s.isEmpty()) {
temp = (char) s.pop();
}else{
s.push(str.charAt(i));
}
然后在mm中我正在检查我的返回堆栈是否为空并打印正确的消息(平衡 - 左丢失 - 右丢失)