平衡使用堆栈检查括号是否在字符串中关闭

我正在编写一个程序来检查是否在用户输入的字符串中关闭括号组,但我对如何操作感到困惑,因为我们需要使用堆栈来完成它。

我的想法是将括号添加到堆栈中(如果它们存在),然后如果出现一个右括号,则弹出堆栈中的前两个字符,如果第二个弹出的字符与第一个匹配(如括号匹配的类型和它既是开始和结束括号,那么线是平衡的。 但是,我需要让它能够处理包含多个括号和字符的字符串,例如:

wfsfs[{{{(s;dkls(dslkf)s;dlkf}]}]}}}sd 

我真的很困惑如何使用堆栈来完成这项工作! 有任何想法吗?

这基本上是我到目前为止提出的代码,但它不适用于多个括号

  for (int i = 0; i < x.length(); i++){ if (x.charAt(i) == '('){ stack.push('('); } if (x.charAt(i) == '['){ stack.push('('); } if (x.charAt(i) == '{'){ stack.push('('); } if (x.charAt(i) == ')'){ stack.pop(); if (stack.empty()){ return true; } if (stack.pop() != ')'){ return true; } } if (x.charAt(i) == ']'){ stack.pop(); if (stack.empty()){ return true; } if (stack.pop() != ']'){ return true; } } if (x.charAt(i) == '}'){ stack.pop(); if (stack.empty()){ return true; } if (stack.pop() != '}'){ return true; } } } return false; } } 

编辑:“x”是一个输入的句子

所以,这是我的想法。 你可以将一个打开的支架推到堆叠上(只有当你有一个打开的支架时才推动),然后在你有一个关闭支架时弹出。 如果由于堆栈中没有任何内容而无法弹出,则测试失败。 如果你到达最后并且堆栈上有东西,则测试失败。

如果它们必须配对会变得更难(即{{} {} {}}失败并不成功),但是如果你再次推动就失败,那么你可以跟踪一旦你开始弹出。

编辑:如果你必须匹配三种“括号”中的一种(技术上你有括号,花括号和圆括号),那么你可以有三个不同的堆栈,或者通过窥视validation堆栈上的顶部“括号”是否匹配结束的。

EDIT2:显示一个伪代码示例:

我有一个字符串:“[[]]”

通过字符串扫描,我看到我的第一个字符是一个开放的括号[我将它弹出到我的堆栈中,使我的堆栈1项大,上面有'[‘。

我的下一个角色也是一个开放式括号,所以我也将它弹出到堆栈中,这意味着我的堆栈中有2个项目,'[‘和'[‘

第三个字符是一个封闭的括号。 我偷看了我的堆栈顶部,看到它与那里的开放式支架相匹配,所以我从堆栈中弹出开放式支架,让我在堆栈上留下一个开放式支架'[‘

我的第四个角色是一个封闭的括号。 我偷看了我的堆栈顶部,发现它与堆栈上的开放式支架相匹配。 我从我的堆栈中弹出这个支架,留下一个空堆栈。

我结束我的字符串,看到我有一个空堆栈,所以这通过。

Edit3:带有不同括号的示例。

说我有一个字符串:“[{(){}}]”

我的第一个角色是'[‘所以我把它弹到堆栈上

我的第二个字符是'{‘所以我把它弹到堆栈上

我的第三个字符是’(’所以我把它弹到堆栈上

我的第四个字符是’)’,所以我先查看堆栈的顶部。 它是一个匹配的paren’(’所以我把它从堆栈中弹出并继续前进。

我的第五个字符是'{‘所以我把它放在堆栈上。

我的第六个字符是’}’所以我偷看我的堆栈的顶部,看到匹配的'{‘并将其从堆栈中弹出。

我的第七个角色是’}’所以我偷看了我的堆栈的顶部,看到匹配的'{‘所以我把它从堆栈中弹出。

我的八个字符是’]’所以我偷看我的堆栈的顶部,看到它是匹配的’]’所以我把它从堆栈中弹出。

我到达了我的字符串的末尾,我的堆栈上没有任何东西,所以我很好,案件通过了。