如何检查括号的有效性

7
我希望能够获取一个字符串并检查其括号是否有效。
例如:
"(ew)[]" - this will be valid.

"(ew[)]" - this will be not valid.

这是我尝试过的方法:
public static bool CheckString(string input)
{
    int braceSum = 0, squareSum = 0, parenSum = 0;

    foreach (char c in input)
    {  
        if (c == '{')
            braceSum++;
        if (c == '}')
            braceSum--;
        if (c == '[')
            squareSum++;
        if (c == ']')
            squareSum--;
        if (c == '(')
            parenSum++;
        if (c == ')')
            parenSum--;

        //check for negatives (pair closes before it opens)
        if (braceSum < 0 || squareSum < 0 || parenSum < 0)
            return false;
    }

    return (braceSum == 0 && squareSum == 0 && parenSum == 0);
}

因此,在这两种情况下,我的代码都将返回true。您有什么建议,以便程序能够正确地工作?


6
请查看:检查字符串中的平衡括号 - Mighty Badaboom
@NikhilKS 或许他对正则表达式不熟悉或者缺乏信心,有时候正则表达式可能会让人感到吓人。 - Cleptus
1个回答

13

尝试使用经典的基于 Stack 的验证:

public static bool CheckString(string input) {
  if (string.IsNullOrEmpty(input))
    return true;

  Stack<char> brackets = new Stack<char>();

  foreach (var c in input) {
    if (c == '[' || c == '{' || c == '(')
      brackets.Push(c);
    else if (c == ']' || c == '}' || c == ')') {
      // Too many closing brackets, e.g. (123))
      if (brackets.Count <= 0)
        return false;

      char open = brackets.Pop();

      // Inconsistent brackets, e.g. (123]
      if (c == '}' && open != '{' ||
          c == ')' && open != '(' ||
          c == ']' && open != '[')
        return false;
    }
  }

  // Too many opening brackets, e.g. ((123) 
  if (brackets.Count > 0)
    return false;

  return true;
}

演示:

 string[] tests = new string[] {
    "123",
    "(123)",
    "(1(23)",
    "(12)3)",
    "(ew)[]",
    "(ew[)]",
    "[12(34]56)",
    "[1+2(3+4)][5+6)",
  };

  string report = string.Join(Environment.NewLine, tests
    .Select(test => $"{test,-15} : {(CheckString(test) ? "Valid" : "Invalid")}"));

  Console.Write(report);

结果:

123             : Valid
(123)           : Valid
(1(23)          : Invalid
(12)3)          : Invalid
(ew)[]          : Valid
(ew[)]          : Invalid
[12(34]56)      : Invalid
[1+2(3+4)][5+6) : Invalid

没有测试过,可能有误,但是这可能会允许 [12(34]56),因为没有区分这三种类型,对吧? - Cleptus
@bradbury9:不,[12(34]56)无效的(请参见我的编辑 - 演示);如果没有测试,请让我们测试一下 ;) - Dmitry Bychenko
@DmitryBychenko 我们能否检查一下"[1+2(3+4)][5+6)"这个表达式。我们也可以检查它的顺序吗? - Ameya Deshpande
@Ameya Deshpande:嗯,"[1+2(3+4)][5+6)"无效的,正如我们所预期的那样:最后一个[没有对应的闭合括号,而是)。请看我的编辑。 - Dmitry Bychenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接