//题干转载自B Bracket Sequence(stack+模拟)_Forward in time的博客-CSDN博客
题意:首先明确,没括号时是加号,每加一重括号之后,+变*或者是*就会变+;
左括号和数字直接入栈,遇到右括号,就算数、清理栈、结果入栈,直到遇到左括号。在这个过程中记录着括号有几重进行相应运算。最后,再将栈中剩余元素相加即可
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1000000007;
typedef long long ll;
stack<ll> q;
int n, m, k;
ll ans;
int main()
{
ios::sync_with_stdio(false), cin.tie(0);
cin >> n;
int cnt = 0; //记录有几重括号
for(int i = 0; i < n; i ++)
{
string s; cin >> s;
if(s=="(") //'(' 记为-1,入栈
{
q.push(-1);
cnt++;
}
else if(s==")") //一直出栈,直到遇到'(' , 记得pop掉 '(';
{
int x = q.top();
q.pop();
if(x==-1) //防止遇到空括号
{
cnt--;
continue;
}
while(q.top()!=-1)
{
ll t = q.top();
q.pop();
if(cnt%2==0) x = (x+t)%N; //判断几重括号,偶数加号,奇数乘号
else x = (x*t)%N;
}
q.pop();
q.push(x);
cnt--;
}
else //遇到数字就入栈
{
ll t = 0, x = s.size();
for(int j = 0; j < x; j ++)
{
t = t*10+s[j]-'0';
}
q.push(t);
}
}
while(q.size()) //经过上述步骤,括号已无,只剩下最外一层,全相加,记得取模;
{
ll t = q.top();
q.pop();
ans = (ans+t)%N;
}
cout << ans;
return 0;
}