欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

B Bracket Sequence(stack+模拟)

程序员文章站 2022-03-27 14:14:39
...

B Bracket Sequence(stack+模拟)B Bracket Sequence(stack+模拟)
题意:给出n个字符串,那么最开始是+,如果遇见一个括号,那么就+变*。或者*变成+;求左后表达式的值为多少;所以这道题就可以用模拟来写了;
具体理解:
B Bracket Sequence(stack+模拟)
这道题有个比较巧妙的就是这个初始化为+,只要遇见那么就变号,所以可以直接用stack来写;一个放运算符,一个放数字,但是注意这点:就是在B Bracket Sequence(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;
}
相关标签: stack