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

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の戻り値) であり、 true に評価されるため、期待どおりに評価されることがわかります。indexOf-1 == -1!(-1 == -1)false

お役に立てれば。

于 2013-09-25T17:09:57.030 に答える
0

CLOSEDの開き括弧と の閉じ括弧を探していますOPENED!

変更する必要があります

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

の中へ

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

または、呼び出しでパラメーターを交換するだけです

matches(corBracket, ch)

それ以外の

matches(ch, corBracket)

その関数の呼び出しをデバッグすると、探しているもの、つまり 0 以上で OPEN.length() 未満のインデックスを見つけることが期待されているため、OPEN.indexOf(openBracket)return witch が疑わしいことがわかります。-1

于 2013-09-25T17:14:11.680 に答える