B Bracket Sequence(stack+模拟)

在这里插入图片描述在这里插入图片描述
题意:给出n个字符串,那么最开始是+,如果遇见一个括号,那么就+变*。或者*变成+;求左后表达式的值为多少;所以这道题就可以用模拟来写了;
具体理解:
在这里插入图片描述
这道题有个比较巧妙的就是这个初始化为+,只要遇见那么就变号,所以可以直接用stack来写;一个放运算符,一个放数字,但是注意这点:就是在在这里插入图片描述
这种情况下,记得把多余的加号去掉就行了;
当时比赛的时候我没有把(入栈,就直接依靠变号来入栈,结果不知道为什么就是wa,最后我把(加上之后就能过了,只不过这是在赛后。。。。真倒霉。:D
AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll Mod=1e9+7;
char fun(char t){
	 if(t=='+')return '*';
	 else return '+';
}
int main(){
  ll n;
   scanf("%lld",&n);
   string s;
   char f='+',t;
      stack<char > st;
   stack<ll > num;
   for(ll i=0;i<n;i++){//其实理解上上面画的图,其实就可以自己模拟了
   	  cin>>s;
   	  if(s[0]=='('){
		  	f=fun(f);
		  	st.push('(');
	 }else if(s[0]==')'){//注意如果遇见)那么需要先pop一个符号,不然会有多余的
          if(st.size())st.pop();
		  	while(st.top()!='('){
		  		if(f=='+'){
		  			ll t1=num.top();num.pop();
		  			ll t2=num.top();num.pop();
		  			num.push((t1+t2)%Mod);
				  }else if(f=='*'){
				  	ll t1=num.top();num.pop();
		  			ll t2=num.top();num.pop();
		  			num.push(t1*t2%Mod);
				  }
				  st.pop();
			  }
			  st.pop();
			  f=fun(f);//注意,这里是需要计算完之后才能变号的
			  st.push(f);
			  //cout<<f<<endl;
	}else{
		ll  t=0;
		for(ll i=0;i<s.size();i++){
   	       t=t*10+s[i]-'0';
	      }
           num.push(t%Mod);
           st.push(f);
           //cout<<f<<endl;
       }
   	}
    if(st.size())st.pop();
     	while(num.size()>1){//这里是把剩余的数计算出来
		  		if(st.top()=='+'){
		  			ll t1=num.top();num.pop();
		  			ll t2=num.top();num.pop();
		  			num.push((t1+t2)%Mod);
				  }else if(st.top()=='*'){
				  	ll t1=num.top();num.pop();
		  			ll t2=num.top();num.pop();
		  			num.push((t1*t2)%Mod);
				  }
				  st.pop();
	  }
		cout<<num.top()%Mod<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值