// 使用 map 来解决括号匹配
#include <iostream>
#include <map>
#include <stack>
#include <string>

using namespace std;

string left_c = "{[(";
map<char, char> map1;

bool valid(const char *p)
{
    stack<char> stk;
    int max_depth = 0;

    while (*p)
    {
        const char &cp = *p;

        // if (left_c.find(cp) != string::npos)     // 如果当前拿到的是左括号
        if (left_c.find(cp) != -1) // 如果当前拿到的是左括号
        {
            // 入栈
            stk.push(*p);
        }
        else // 如果当前拿到的是右括号
        {
            // 弹栈
            if (stk.empty())
                return false;

            const char &top = stk.top();
            if (map1[cp] != top)
                return false;

            // 当前左右匹配的后续操作
            // 求最大深度
            if (max_depth < stk.size())
                max_depth = stk.size();

            // 弹栈前判断最大深度
            stk.pop();
        }
        p++;
    }
    cout << "当前括号栈的最大深度为: " << max_depth << endl;

    return stk.empty();
}

int main()
{
    map1.insert(make_pair('}', '{'));
    map1.insert(make_pair(']', '['));
    map1.insert(make_pair(')', '('));

    cout << valid("{[()]}[[[[[()]]]]]") << endl;
    cout << valid("{[())}") << endl;
    return 0;
}
