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

猜你喜欢

转载自blog.csdn.net/qq_44555205/article/details/104886346