下面我粘贴的代码演示了如何使用堆栈数据结构检查分隔符(大括号,括号和括号)中的余额。
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();
}
}
我在理解check方法时遇到了一些麻烦,因为我是java新手并且正在寻找某人的细分。我将在下面列出我到目前为止完全理解的内容(如果我错了,请纠正我)。如果有人能指导我,我真的很感激。
我的理解
所以首先创建一个char类型的堆栈。然后for循环通过char迭代输入字符串char,如果找到变量ch,它将被推入堆栈。然而,我发现奇怪的是,根据我对switch语句的理解,每个case应该在它之后有一个动作。在这种情况下,在案例'{':或案例'[':或案例'('
)之后没有任何行动此外,如果我理解这对开放分隔符是正确的,那么switch语句建议一个push动作,而对于结束动作,它会启动一个pop动作,假设堆栈不为空?
任何人都可以清理一下吗?如果可能的话,还会给我一个带有小字符串的手跟踪示例。
答案 0 :(得分:2)
switch语句执行所有case语句,从匹配条件的语句开始,直到遇到break。
case '{':
case '[':
case '(':
theStack.push(ch);
break;
此代码表示theStack.push(ch)
代表'{','['或'('。
举个例子,让我们考虑一下这个字符串 - ({}[])
(实际的输入字符串可以包含非括号字符,但算法忽略它们,所以我们也可以忽略它们)
'('推入堆栈中
'{'被推入堆栈中
'}'弹出'{'并找到一个匹配项(如果堆栈为空,或弹出的支架属于不同类型,则检查失败)
'[推入堆栈中]
'''pops'['并找到一个匹配
')'pops'('并找到一个匹配
处理完String后,堆栈必须为空才能通过检查(否则,会有未封闭的括号)。