JAVA:圆括号匹配方法不打印

时间:2013-09-25 16:56:21

标签: java algorithm search

嘿,我正在进行编程任务,我们必须在String中匹配括号。我们必须输出错误消息,如下所示:

示例I / O:

输入要测试的字符串: (< [{}({>)]>

错误:'>'与'{'。

不匹配

我正在尝试在我的isBalanced()方法中打印此消息,但是它不会打印System.out.println()但它会到达该代码块(否则它将永远不会返回false)。我认为问题在于我的主要方法,但我已经尝试了一段时间而且我很难过! 任何帮助表示赞赏。 谢谢,

凯尔。

  import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.EmptyStackException;
import java.util.Stack; //using java's default stack in this case as it has more extraneous error checking
public class Question3 {
    private static final String OPEN = "([{<";
    private static final String CLOSED = ")]}>";

    public static void main(String[] args) throws IOException {
        BufferedReader inKb = new BufferedReader(new InputStreamReader(
                System.in));

        System.out.println("Enter a test string:");
        String input = inKb.readLine();

        boolean successful = isBalanced(input);
        System.out.println(successful);
    }

    public static void printError(char ch, char expected) {
        System.out.println("Error: '" + ch + "' does not match with '"
                + expected + "'");
    }

    private static boolean isOpen(char bracket) {
        return OPEN.indexOf(bracket) >= 0;
    }

    private static boolean isClosed(char bracket) {
        return CLOSED.indexOf(bracket) >= 0;
    }

    private static boolean matches(char openBracket, char closedBracket) {
        return OPEN.indexOf(openBracket) == CLOSED.indexOf(closedBracket);
    }

    public static boolean isBalanced(String input) {
    Stack<Character> stack = new Stack<Character>();
        try {
            for (int i = 0; i < input.length(); i++) {
                char ch = input.charAt(i);
                if (isOpen(ch)) {
                    stack.push(ch);
                } else if (isClosed(ch)) {
                    char corBracket = stack.pop(); // pop corresponding bracket
                    if (!matches(ch, corBracket)) {
                        System.out.println("Print Test!"); //Not printing?
                        return false;
                    }

                }
            }
        } catch (EmptyStackException ex) {
            return false;
        }

        return stack.isEmpty(); //if stack is empty then the corresponding bracket wasn't found!
    }
}

3 个答案:

答案 0 :(得分:3)

if (!matches(ch, corBracket)) {

ch是结束,corBracket是开场。你需要扭转它们

if (!matches(corBracket, ch)) {

匹配方法语义

private static boolean matches(char openBracket, char closedBracket) {
    boolean value = OPEN.indexOf(openBracket) == CLOSED.indexOf(closedBracket);
    return value;
}

您在matches方法中使用描述性名称。你应该在其他地方做同样的事情。

答案 1 :(得分:2)

这是一个使用调试器很有用的例子。

使用输入( < )调试您的应用程序告诉我!matches(ch, corBracket)被评估为false,因此忽略您的if语句。这导致我们认为您的matches(char, char)方法不正确。

如果您尝试将matches方法更改为以下内容:

private static boolean matches(char openBracket, char closedBracket) {
  int i1 = OPEN.indexOf(openBracket);
  int i2 = CLOSED.indexOf(closedBracket);

  return (i1 == i2);
}

您将在调试器中看到i1i2都是-1(在没有出现的情况下返回indexOf}并且{{1}评估为true,-1 == -1按预期评估为!(-1 == -1)

希望这有帮助。

答案 2 :(得分:0)

您正在CLOSED寻找开放式行李并在OPENED中关闭括号!

你需要改变

 return OPEN.indexOf(openBracket) == CLOSED.indexOf(closedBracket);

 return CLOSED.indexOf(openBracket) == OPEN.indexOf(closedBracket);

或只是交换通话中的参数

matches(corBracket, ch)

而不是

matches(ch, corBracket)

调入函数会告诉你OPEN.indexOf(openBracket)返回-1女巫的调用,因为你期望找到你要搜索的内容,即一个大于或等于0的索引,少于OPEN.length()