我正在编写一个程序来检查是否在用户输入的字符串中关闭括号组,但我对如何操作感到困惑,因为我们需要使用堆栈来完成它。
我的想法是将括号添加到堆栈中(如果它们存在),然后如果显示一个右括号,则弹出堆栈中的顶部两个字符,如果第二个弹出的字符与第一个匹配(如括号类型)匹配,它是一个开始和结束括号)然后线是平衡的。但是,我需要让它能够处理包含多个括号和字符的字符串,例如:
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;
}
}
编辑:&#34; x&#34;是一个有争议的句子
答案 0 :(得分:0)
所以,这是我的想法。你可以将一个打开的支架推到堆叠上(只有当你有一个打开的支架时才推动),然后只要你有一个右括号就弹出。如果由于堆栈中没有任何内容而无法弹出,则测试失败。如果你到达最后并且堆栈上有东西,那么测试就会失败。
如果必须配对,这会变得更加困难(即{{} {} {}}失败并不成功),但是如果你再次推动,你可以跟踪一旦你开始弹出失败。
编辑:如果你必须匹配三种“括号”中的一种(技术上你有括号,花括号和圆括号)那么你可以有三个不同的堆栈,或者通过窥视验证顶部的“括号”堆栈与结束堆栈匹配。
EDIT2:显示伪代码示例:
我有一个字符串:“[[]]”
通过字符串扫描,我看到我的第一个字符是一个开放式括号[我将它弹出到我的堆栈中,使我的堆栈1项大,上面带有'['。
我的下一个角色也是一个开放式括号,所以我也将它弹出到堆栈中,这意味着我的堆栈中有2个项目,'['和'['
第三个字符是一个封闭的括号。我偷看了我的堆栈顶部,看到它与那里的开放式支架相匹配,所以我从堆栈中弹出开放式支架,让我在堆栈上留下一个开放式支架'['
我的第四个角色是一个封闭的括号。我偷看了我的堆栈顶部,发现它与堆栈上的开放式支架相匹配。我从支架上弹出这个支架,留下一个空的堆栈。
我结束我的字符串,看到我有一个空堆栈,所以这就过去了。
Edit3:带有不同括号的示例。
说我有一个字符串:“[{(){}}]”
我的第一个角色是'['所以我把它弹到堆栈上
我的第二个字符是'{'所以我把它弹到堆栈
我的第三个字符是'('所以我把它弹到堆栈
我的第四个角色是')',所以我偷看了堆栈的顶部。它是一个匹配的paren'('所以我把它从堆栈中弹出并继续前进。
我的第五个字符是'{'所以我将其弹出堆栈。
我的第六个角色是'}'所以我偷看了我的堆栈顶部,看到匹配的'{'并将其从堆栈中弹出。
我的第七个角色是'}'所以我偷看了堆叠的顶部,看到匹配的'{'所以我把它从堆栈中弹出。
我的八个字符是']'所以我偷看我的堆栈的顶部并看到它是匹配的']'所以我把它从堆栈中弹出。
我到达了我的字符串的末尾并且我的堆栈上没有任何东西,所以我很好,并且案件通过了。