555,有点感动,本蒟蒻第一次写题解。

这题是一类简单的模拟题,可以用数组模拟,当然也可以用c++里的stack更加直观地解决。

栈(stack)的特点是先进先出。

题目中,输入第一个“)”时如果前面一个不是“("那就只能是所有括号中的第一个!这种情况显然是输出no的,所以我们可以从头开始遍历输入的字符串,碰到"("就让它进栈,一旦碰到 “)” 就及时的删除栈顶的 “(”,最后如果这是合法括号组,那么所有的括号将完全抵消,这时栈为空栈,输出YES即可,若有剩余(不为空栈),则输出NO,表示不合法。

附上弱弱的代码

需要注意的是,第十五行的&&(逻辑与符号)连接的两个条件的顺序不可以写反,如果先索引栈顶,再判断空栈,就会造成段错误(非法访问)。有兴趣的朋友可以试试

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a;
    int n;
    stack <char> c;
    cin>>n;
    cin>>a;
    for(auto i:a)
    {
        if(i=='(')c.push(i);
        if(i==')')
        {
            if(!c.empty()&&c.top()=='(')c.pop();
            else {
                cout<<"NO";
                return 0;
            }
        }
    }
    if(c.empty())cout<<"YES";
    else cout<<"NO";
}