【问题标题】:Checking Delimiter Using a Stack使用堆栈检查分隔符
【发布时间】: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 语句之间没有中断,则评估“失败”。你可以把它想象成一个或 - 如果字符是 { 或 [ 或 ( 则将其压入堆栈。

标签: java stack delimiter


【解决方案1】:

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

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

此代码表示theStack.push(ch) 对'{'、'[' 或'(' 中的任何一个都执行。

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

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

'('入栈
'{' 入栈
'}' 弹出 '{' 并找到匹配项(如果堆栈为空,或者弹出的括号为不同类型,则检查失败)
'[' 入栈
']' 弹出 '[' 并找到匹配项
')' 弹出 '(' 并找到匹配项

处理完String后,栈必须为空才能通过校验(否则会有非右括号)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 2021-11-02
  • 2011-04-30
  • 2013-06-18
  • 2022-01-02
相关资源
最近更新 更多