使用堆栈检查分隔符

时间:2014-07-30 02:00:22

标签: java stack delimiter

下面我粘贴的代码演示了如何使用堆栈数据结构检查分隔符(大括号,括号和括号)中的余额。

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动作,假设堆栈不为空?

任何人都可以清理一下吗?如果可能的话,还会给我一个带有小字符串的手跟踪示例。

1 个答案:

答案 0 :(得分:2)

switch语句执行所有case语句,从匹配条件的语句开始,直到遇到break。

  case '{': 
  case '[':
  case '(':
    theStack.push(ch);
    break;

此代码表示theStack.push(ch)代表'{','['或'('。

举个例子,让我们考虑一下这个字符串 - ({}[])

(实际的输入字符串可以包含非括号字符,但算法忽略它们,所以我们也可以忽略它们)

'('推入堆栈中 '{'被推入堆栈中 '}'弹出'{'并找到一个匹配项(如果堆栈为空,或弹出的支架属于不同类型,则检查失败)
'[推入堆栈中] '''pops'['并找到一个匹配
')'pops'('并找到一个匹配

处理完String后,堆栈必须为空才能通过检查(否则,会有未封闭的括号)。