这让我有些慌张。我花了很长时间试图找到错误并且不能。问题是确定给定的括号输入字符串是否平衡。输入' {[()()]}'当它应该返回1时返回0.下面的代码实际上从未到达返回1部分,但我不明白为什么不 - 那时堆栈应该是空的。有什么想法吗?
#include <stack>
int solution(string &S) {
stack<char> bracketStack;
char a, b, c;
for (int i = 0; i < S.length(); i++) {
if (S[i]=='{' || S[i]=='[' || S[i]=='(') {
bracketStack.push(S[i]);
} else {
switch (S[i]) {
case ('}') :
a = bracketStack.top();
bracketStack.pop();
if (a==']' || a==')') {
return 0;
}
case (']') :
b = bracketStack.top();
bracketStack.pop();
if (b=='}' || b==')') {
return 0;
}
case (')') :
c = bracketStack.top();
bracketStack.pop();
if (c==']' || c=='}') {
return 0;
}
}
}
}
if (bracketStack.empty()) {
cout << "empty";
return 1;
} else {
return 0;
}
}
答案 0 :(得分:1)
你的代码逻辑有一个错误:调用
a = bracketStack.top(); // or b, or c
在switch
的所有三个分支中的不受检查堆栈非空的保护。当有更多关闭括号而不是打开括号时,这将导致未定义的行为(从堆栈的无效元素读取)。
解决此问题将解决您遇到的问题。但是,您的程序仍然不是最佳的,因为这三个分支看起来几乎相同。您可以通过组合交换机来解决此问题,如下所示:
// Set up an array of matching brackets: } --> {, ] --> [, ) --> (
char match[128] = {0};
match['}'] = '{';
match[']'] = '[';
match[')'] = '(';
... // This goes inside the `for` loop
if (S[i]=='{' || S[i]=='[' || S[i]=='(') {
bracketStack.push(S[i]);
} else {
if (bracketStack.empty()) {
cout << "More closing brackets than opening ones" << endl;
return 0;
}
a = bracketStack.top();
bracketStack.pop();
if (match[a] != S[i]) {
cout << "Mismatched" << endl;
return false;
}
}