C. Bad Sequence(stack括号匹配问题)

在这里插入图片描述
在这里插入图片描述
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值