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";
}