【发布时间】:2014-07-30 02:00:21
【问题描述】:
我在下面粘贴的以下代码演示了如何使用堆栈数据结构检查分隔符(大括号、方括号和圆括号)中的余额。
import java.util.Stack;
class BracketChecker {
private String input;
public BracketChecker(String in) {
input = in;
}
public void check() {
Stack<Character> theStack = new Stack<Character>();
for (int j = 0; j < input.length(); j++) {
char ch = input.charAt(j);
switch (ch) {
case '{':
case '[':
case '(':
theStack.push(ch);
break;
case '}':
case ']':
case ')':
if (!theStack.isEmpty()) {
char chx = theStack.pop();
if ((ch == '}' && chx != '{') || (ch == ']' && chx != '[') || (ch == ')' && chx != '('))
System.out.println("Error: " + ch + " at " + j);
} else
System.out.println("Error: " + ch + " at " + j);
break;
default:
break;
}
}
if (!theStack.isEmpty()){
System.out.println("Error: missing right delimiter");
}
}
}
public class MainClass {
public static void main(String[] args) {
String input;
input = "[]]()()";
BracketChecker theChecker = new BracketChecker(input);
theChecker.check();
}
}
我在理解检查方法时遇到了一些麻烦,因为我是 Java 新手,正在寻找某人的故障。我将在下面列出到目前为止我完全理解的内容(如果我错了,请纠正我)。如果有人可以指导我,我将不胜感激。
我的理解
首先创建一个字符类型的堆栈。然后一个for循环逐个字符地遍历输入字符串char,如果找到变量ch,它将被推入堆栈。然而,我觉得奇怪的是,根据我对 switch 语句的理解,每个案例都应该在它之后有一个动作。在这种情况下, case '{': 或 case '[': 或 case '('
另外,如果我理解这对于打开的分隔符是正确的,那么 switch 语句会建议一个推送操作,而对于关闭的分隔符,它会启动一个弹出操作,因为堆栈不是空的?
谁能帮我解惑?另外,如果可能的话,请向我展示一个带有小字符串的手迹示例。
【问题讨论】:
-
“建议”?语句不会被建议,它们会被执行(我猜“启动”也很好,意思是一样的)。
-
如果 case 语句之间没有中断,则评估“失败”。你可以把它想象成一个或 - 如果字符是 { 或 [ 或 ( 则将其压入堆栈。