C++栈,括号匹配问题求解

C++栈问题,括号匹配问题求解,无法AC,求指教!
【题目描述】
设有一字符串中有三种括号:(),[],{};忽略不看其他字符,判断这些括号的匹配情况是否成立。例如:“(([()])){}”是匹配的,而“([)]”则是不匹配的。
【输入格式】
只有一行且只有一个数据:一串以“@”为结束符的字符串。字符串长度不会超过20000
【输出格式】
只有一行且只有一个数据:如果是匹配的,则输出:“OK!”,否则输出第一个不相匹配的括号位置(输入数据保证相同类型的左右括号个数相等)。
【输入样例 】
82u(idkj[kdk]js{ksf(k[sk)k])o}i@
【输出样例】
25

实现的思路主要是遍历字符串,首先我们将所有左括号推入栈中,遇到右括号时,弹出栈顶元素,检查它是否匹配当前右括号。如果不匹配或栈为空,则表明括号不匹配。这在数据结构栈的入门就讲过。


#include <iostream>
#include <stack>
#include <cstring>
using namespace std;

int main()
{
    char str[20001];
    cin >> str;

    stack<char> s;
    int len = strlen(str);
    for (int i = 0; i < len; i++)
    {
        if (str[i] == '(' || str[i] == '[' || str[i] == '{')
        {
            s.push(str[i]);
        }
        else if (str[i] == ')' || str[i] == ']' || str[i] == '}')
        {
            if (s.empty())
            {
                cout << i + 1 << endl;
                return 0;
            }
            char top = s.top();
            s.pop();
            if ((top == '(' && str[i] != ')') || (top == '[' && str[i] != ']') || (top == '{' && str[i] != '}'))
            {
                cout << i + 1 << endl;
                return 0;
            }
        }
    }

    if (s.empty())
    {
        cout << "OK!" << endl;
    }
    else
    {
        cout << len << endl;
    }

    return 0;
}

已解决, 如有帮助给个采纳哦! 后面我会把代码的分析写在博客里面: 运行截图如下

img

代码如下:

#include <iostream>
#include <stack>
using namespace std;

bool isMatch(char left, char right) {
    return (left == '(' && right == ')') || (left == '[' && right == ']') || (left == '{' && right == '}');
}

int main() {
    string s;
    getline(cin, s, '@'); // 读入以@结尾的字符串
    stack<pair<char, int>> stk; // 使用pair记录括号类型和位置

    for (int i = 0; i < s.size(); i++) {
        if (s[i] == '(' || s[i] == '[' || s[i] == '{') { // 左括号入栈
            stk.push({s[i],i});
        } else if (s[i] == ')' || s[i] == ']' || s[i] == '}') { // 右括号出栈比较
            if (stk.empty() || !isMatch(stk.top().first, s[i])) { // 不匹配
                cout << i << endl;
                return 0;
            } else { // 匹配,弹出左括号
                stk.pop();
            }
        }
    }

    // 遍历完字符串后,栈中还有元素说明不匹配
    if (!stk.empty()) {
        cout << stk.top().second << endl;
    } else {
        cout << "OK!" << endl;
    }
    return 0;
}


```