0

Hey I am doing a programming assignment and we have to match parentheses in a String. We have to output an Error message such as the following:

Sample I/O:

Enter a string to test: ( < [ { } ( { > ) ] >

error: '>' does not match with '{'.

I am trying to print this message in my isBalanced() method however it will not print the System.out.println() however it is reaching that code block (otherwise it would never return false) which it is. I think the problem lies in my main method but I have been trying for a while now and I am stumped! Any help is appreciated. Thanks,

Kyle.

  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!
    }
}
4

3 回答 3

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。你应该在其他地方做同样的事情。

于 2013-09-25T17:06:55.080 回答
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 == -1!(-1 == -1)false

希望这可以帮助。

于 2013-09-25T17:09:57.030 回答
0

您正在寻找CLOSEDOPENED!

你需要改变

 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() 的索引

于 2013-09-25T17:14:11.680 回答