对于我的CS类,我必须创建一个布尔函数isBalanced(String x),它接受一个字符串并计算括号/括号的数量,如果括号与其对匹配则返回true(例如; {是一对of,(是一对),[是一对],等等。如果括号正确匹配,则该函数将返回true,否则返回false。为了澄清,如果您想知道该对象是什么,MyStack()是我自己的Java堆栈接口实现。
代码如何工作和返回的示例:
{A(B [C])D}将返回true。
{A(B [C]] D}将返回false。
我的代码中的问题是逻辑错误。出于某种原因,如果缺少括号,我的函数将返回true,该括号应返回false。
{A(B)C将返回false,但我的代码将其视为true。您是否有任何可以帮助我的代码正常工作的解决方案?谢谢!
Balancer.java
public static boolean isBalanced(String x) {
MyStack<String> stack = new MyStack();
if (x.substring(0,1).equals("}") || x.substring(0,1).equals(")") || x.substring(0,1).equals("]")) {
return false;
}
for (int i=0; i<x.length(); i++) {
if (x.substring(i,i+1).equals("{") || x.substring(i,i+1).equals("(") || x.substring(i,i+1).equals("[")) {
stack.add(x.substring(i,i+1));
}
if (x.substring(i,i+1).equals("}") || x.substring(i,i+1).equals(")") || x.substring(i,i+1).equals("]")) {
if (x.substring(i,i+1).equals("}") && stack.peek().equals("{")) {
stack.pop();
} else if (x.substring(i,i+1).equals(")") && stack.peek().equals("(")) {
stack.pop();
} else if (x.substring(i,i+1).equals("]") && stack.peek().equals("[")) {
stack.pop();
} else {
return false;
}
}
}
return true;
}
这个标记为Main.java的文件只是一个测试人员。我省略了代码工作的其他情况。函数应该返回false的原因是有一个缺失的}应该在最后,但没有,但我的函数由于某种原因返回true。
Main.java
public static void main(String[] args) {
...
String test4 = "{AA[B(CDE{FG()T})V]";
System.out.println("Missing final close (empty stack case)");
System.out.println("Should be false, is: " + Balancer.isBalanced(test4)); // does not work
}
答案 0 :(得分:0)
如果找到匹配的括号对,您有一系列条件只会弹出堆栈。我认为你过于复杂 - 如果找到一个开口括号,将它推到堆栈。如果找到右括号,则弹出堆栈并确保它们匹配。 E.g:
private static final Map<Character, Character> CLODSE_TO_OPEN = new HashMap<>();
static {
CLODSE_TO_OPEN.put(')', '(');
CLODSE_TO_OPEN.put(']', '[');
CLODSE_TO_OPEN.put('}', '{');
}
public static boolean isBalanced(String x) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < x.length(); ++i) {
char c = x.charAt(i);
if (CLODSE_TO_OPEN.containsValue(c)) {
stack.push(c);
} else if (CLODSE_TO_OPEN.containsKey(c)) {
try {
if (!CLODSE_TO_OPEN.get(c).equals(stack.pop())) {
return false;
}
} catch (EmptyStackException e) {
return false;
}
}
}
return stack.isEmpty();
}