原理是两个成对的括号消掉,不可能存在增加一个括号可以消掉两对括号的情况,要特判只有右半边没有左半边而且栈还是空的的情况,"]["这种不可能是有效的对吧?只要括号序列有效,那么最后一定完全能匹配,全都消消乐消没了栈就是空的。

注意:"[(])"不是有效的,两个成对括号没贴一起,中间隔了奇奇怪怪的玩意,消不了

class Solution {
public:
    bool isValid(string s) {
        stack<char> a;
        for(int i=0;i<s.size();i++){
            if((s[i]==')'||s[i]==']'||s[i]=='}')&&a.empty())return false;
            if((s[i]==')'&&a.top()=='(')||(s[i]==']'&&a.top()=='[')||(s[i]=='}'&&a.top()=='{')){
                a.pop();
            }else{
                a.push(s[i]);
            }
        }return a.empty();
    }
};