stack模拟思路:如果(进stack如果)那么检查是否与stack.top元素匹配;配对则出stack反之如stack;
这道题手动写一下就会发现这个问题;
如果(()这种,那么肯定不配对,因为左右数量不相等;
如果是))))(((可以很明显知道如果用stack来存,那么最后的大小肯定是>2的那么肯定不可能成立;
如果是())(如果是这种那么根据stack模拟那么stack最终大小为2;
所以我可以知道:
1.左右括号数量不等,那么肯定No
2.如果最后根据stack模拟出来的size>2那么肯定不成立;
3.如果最后stack的size为<=2那么肯定Yes,因为可以移动一个括号使得他们匹配;
所以AC代码:
#include<bits/stdc++.h>
using namespace std;
stack<char> Stack;
int main(){
int n;
scanf("%d",&n);
string s;
cin>>s;
int left=0,right=0;//统计左右符号
for(int i=0;i<s.length();i++){
if(Stack.empty())Stack.push(s[i]);//为空那么进stack
else if(Stack.top()=='('&&s[i]==')')Stack.pop();//配对pop
else Stack.push(s[i]);//没配对入stack
if(s[i]=='(')left++;
else right++;
}
if(left!=right)puts("No");
else if(Stack.size()<=2)puts("Yes");//如果为2那么肯定为)(这种,那么根据移动肯定就可以配对了
else puts("No");
return 0;
}