B Bracket Sequence(stack+模拟)
程序员文章站
2022-03-27 14:14:39
...
题意:给出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;
}
上一篇: 详解CSS3的filter滤镜属性
下一篇: php语言的核心功能是什么?