L-括号匹配

题解

       这一题很显然是用栈来解决,但我还是决定写一下题解,因为最后一个有一个测试点总过不去。

       首先栈中存储的是字符而不能是下标,为什么呢?,因为在匹配的过程中会出现 {[}],其实这是不匹配的,必须成对出现,即{[]},开始我应该是理解错了,用了三个栈,不过没必要。

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

string s;
stack <char> st;
int ans1 = 0, ans2 = 0;
bool flag = false;

int main()
{
    getline(cin, s);
    for (int i = 0; i < s.size(); ++i) {
        if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
            st.push(s[i]);
            ++ans1;    
        }
                
        else if (s[i] == ')') {
            if (!st.empty()) {
                if (st.top() == '(')  
                    st.pop();    
                else
                    flag = true;
            } 
            else {
                flag = true;
            }
            ++ans2;
        }
        
        else if (s[i] == '}') {
            if (!st.empty()) {
                if (st.top() == '{')  
                    st.pop();    
                else 
                    flag = true;
            } 
            else {
                flag = true;
            }
            ++ans2;
        }
        
        else if (s[i] == ']') {
            if (!st.empty()) {
                if (st.top() == '[') 
                    st.pop();    
                else
                    flag = true;
            } 
            else {
                flag = true;
            }
            ++ans2;
        }
    }
    cout << ans1 << " " << ans2 << endl;
    if (!st.empty()) {
        flag = true;
    }
    if (!flag) {
        puts("YES");
    } else {
        puts("NO");
    }
    return 0; 
}

 

        

posted @ 2020-11-01 17:14  Fool_one  阅读(204)  评论(0编辑  收藏  举报