平衡括号 - 堆栈未被认为是空的

Balanced Brackets - stack not recognized as empty

本文关键字:认为是 堆栈 平衡      更新时间:2023-10-16

这让我有些蝙蝠。我花了很长的时间试图找到错误,而无法。问题是确定给定的括号是否平衡。输入'{[()()]}'在应返回1时返回0。有什么想法吗?

#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;
}
}

您的代码逻辑有一个错误:呼叫

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