题意:给出n个字符串,那么最开始是+,如果遇见一个括号,那么就+变*。或者*变成+;求左后表达式的值为多少;所以这道题就可以用模拟来写了;
还有一种dfs写法
#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int,int>PII;
const int N=1e6+100,M=1010,inf=0x3f3f3f3f,mod=1e9+7;
stack<int>g;
int flag;
string s[N];
int n;
int fun(string p)
{
int res=0;
for(int i=p.size()-1;i>=0;i--)
{
res+=(p[i]-'0')*pow(10,p.size()-i-1);
}
return res;
}
void solve()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>s[i];
for(int i=0;i<n;i++)
{
if(s[i]=="(")
{
flag++;
g.push(-1);
}
else if(s[i]==")")
{
if(flag%2==1)
{
int cnt=1;
while(g.size()&&g.top()!=-1)
{
cnt=cnt*g.top()%mod;
g.pop();
}
g.pop();
g.push(cnt%mod);
//flag--;
//cout<<cnt<<"flag==1"<<endl;
}
else
{
int cnt=0;
while(g.size()&&g.top()!=-1)
{
cnt=(cnt+g.top())%mod;
g.pop();
}
g.pop();
g.push(cnt%mod);
//flag--;
//cout<<cnt<<"flag==2"<<endl;
}
flag--;
}
else
g.push(fun(s[i]));
}
int ans=0;
while(g.size())
{
// cout<<g.top()<<endl;
ans=(ans+g.top())%mod;
g.pop();
}
cout<<ans%mod<<endl;
}
signed main()
{
Ysanqian;
int T;
T=1;
//scanf("%d",&T);
while(T--)solve();
return 0;
}
dfs写法
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <deque>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
//#include <unordered_map>
//#include <bits/stdc++.h>
#define x first
#define y second
typedef long long ll;
#define PII pair<int, int>
const int N = 100100;
using namespace std;
int cnt;
const ll mod = 1e9 + 7;//注意别忘了取模
ll dfs(ll deep) { //标记这一层是加法还是乘法
string s;
ll ret, flag = 0; // flag用来标记有没有()的情况发生
ll add;
if (deep & 1) //等价于deep%2
ret = 0;
else
ret = 1;
while (cnt-- && cin >> s) { //注意顺序不要反了
if (s == "(") {
add = dfs(deep + 1);
if (add == -1) continue;
flag = 1;
if (deep & 1)
ret += add, ret %= mod;
else
ret *= add, ret %= mod;
} else if (s == ")") {
if (flag)
return ret % mod;
else
return -1;
} else {
flag = 1;
ll f = stoi(s); //将字符串(string)转为整数
if (deep & 1)
ret += f, ret %= mod;
else
ret *= f, ret %= mod;
}
}
return ret % mod;
}
int main() {
cin >> cnt;
cout << dfs(1) << "\n";
return 0;
}