0

我正在编写一个执行分隔符检查的程序。当用户输入一个表达式时,例如

12+{2*[3*(24+45)+5]}

我需要检查分隔符是否匹配(有点像 java 编译器在我们的表达式中检查的内容)。

我知道这可以通过大量if/else if语句来完成,但我记得使用正则表达式处理字符串,例如:

if(s.matches("[abc]+")
System.out.print(s);

但这不适用于角色。如果我能写一个类似于上面的表达式,那就太好了:

for(byte i = 0; i < aString.length(); i++)
{
    if(aString.charAt(i).matches("[({[]})]+")   // maybe '[]' is a problem
    stack.push(aString.charAt(i));
}

字符是否存在这种方法?我能做些什么?

4

2 回答 2

2

您可以维护一个List<Character>包含“分隔符”字符的 a,然后 list.contains()在字符串中的每个字符上运行以确定它是否是有效的分隔符 - 这比您的任务的正则表达式性能要高得多。不过,您可能需要重新考虑String使用 abyte作为循环变量来循环 a;这可能并不总是适合你。对于一个简单的字符串(除了 BMP 没有花哨的 Unicode 字符),您可以使用for (char ch : aString.toCharArray()) {...}.

于 2013-10-13T23:43:15.893 回答
2

我会说一个解决方案是使用堆栈并从每个输入字符串重新开始。

  1. {, [, (找到打开的支架后,其推入堆栈。
  2. }, ], )找到右括号时,将其从堆栈中弹出。
  3. 使用 if 语句进行比较,看看是否有匹配项。false如果您不这样做,请返回。

完成搜索后,检查是否有空堆栈,然后返回truefalse

堆栈示例:分隔符匹配

false仅当您缺少分隔符匹配时,才会返回此使用 Stack 的示例。

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");
    }
  }
}

class delimTest {
  public static void main(String[] args) {

    String input = "12+{2*[3*(24+45)+5}";

    BracketChecker theChecker = new BracketChecker(input);
    theChecker.check();
  }
}
于 2013-10-14T00:17:00.123 回答