他の人が言ったように(この問題のアルゴリズムを実際に調べた後)コードを修正し、私のソリューションが機能するようになりました!ただし、ここでエラー メッセージを出力する必要があります。「{ } < )」という入力があるとエラー メッセージが表示されますが、それは ) が < と一致しないことを返しますが、開き括弧が閉じられていないことと、閉じ括弧に対応する開き括弧がないことも通知する必要があります。現在の実装でこれを行う方法がわかりません。どんな助けでも素晴らしいでしょう!ありがとう、カイル。
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().replaceAll(" ", "");
System.out.print(parChecker(input));
// System.out.println(successful);
}
private static boolean isOpen(char ch) {
return OPEN.indexOf(ch) >= 0;
}
private static boolean isClosed(char ch) {
return CLOSED.indexOf(ch) >= 0;
}
private static boolean matches(char open, char close) {
int openIndex = OPEN.indexOf(open);
int closeIndex = CLOSED.indexOf(close);
return (openIndex == closeIndex);
}
public static boolean parChecker(String input) {
boolean balanced = true; // is stack balanced (matching parentheses)
boolean ret = false; // return value
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < input.length() && balanced; i++) { // if it's not
// balanced stop
// searching
char bracket = input.charAt(i);
if (isOpen(bracket)) {
stack.push(bracket);
} else if (stack.isEmpty())
balanced = false;
else {
char top = stack.pop();
if (matches(top, bracket) == false) {
System.out.println("Error: '" + bracket
+ "' does not match with '" + top + "'.");
balanced = false;
}
}
}
if (balanced && stack.isEmpty()) {
System.out
.println("The string is correct! There are no mismatched brackets");
ret = true;
} else
ret = false;
return ret;
}
}