Java堆栈/无法找到逻辑错误

时间:2017-10-16 20:37:54

标签: java

对于我的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        
}

1 个答案:

答案 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();
}