嘿,我正在进行编程任务,我们必须在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!
}
}
答案 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);
}
您将在调试器中看到i1
和i2
都是-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()