写了四个函数,分别来实现各个功能
int
kuohao(string str);//去括号的函数
int
cheng(
int
a,string b);//乘法的函数
int
jia(
int
a,string b);//加法的函数
int
Smax(string str);//Smax的函数
#include<bits/stdc++.h>
using namespace std;
int kuohao(string str);
int cheng(int a,string b);
int jia(int a,string b);
int Smax(string str);
string SOLVE(string str,int l)
{
string ans;
for(int i = l; i < str.length(); i++)
ans += str[i];
return ans;
}
int solve(int a,string str)
{
int sz = a;//a一般为0
int fi = 1;
for(int i = 0; i < str.length(); i++)
{
while(str[i] == ' ') i++;
if(str[i] == '+') return jia(sz*fi,SOLVE(str,i+1));
if(str[i] == '*') return cheng(sz*fi,SOLVE(str,i+1));
if(str[i] == '(') return kuohao(str);
if(str[i] == 'S') return Smax(str);
if(str[i] == '-') fi = -1;
sz = sz*10+str[i]-'0';
}
return sz*fi;
}
int kuohao(string str)
{
string s;
int i = 1;
int k = 0;
while(str[i] != ')' || k)//结束的时候i指向‘)’
{
if(str[i] == '(') k++;
if(str[i] == ')') k--;
s += str[i++];
}
i++;//只想‘)’后一个字符
if(i != str.length())
return solve(solve(0,s),SOLVE(str,i));//先将括号里的算出来,再和后面的内容处理
else
return solve(0,s);//i == str.length()表示s后面没有内容
}
int cheng(int a,string b)
{
string ans;
int i = 0;
if(b[0] == '(' || b[0] == 'S')//如果乘号后面是()或者Smax(),先将()或者Smax()里面的算出来
{
int k = -1;
while(b[i] != ')' || k)
{
if(b[i] == '(') k++;
if(b[i] == ')') k--;
ans = ans + b[i++];
}
ans += b[i++];
}
else//如果乘号后面是数字
{
while(i < b.length() && b[i] <= '9' && b[i] >= '0')//结束后i指向一个符号
ans = ans + b[i++];
}
if(i == b.length())
return a*solve(0,ans);
else
return solve(a*solve(0,ans),SOLVE(b,i));
}
int jia(int a,string b)
{
return a + solve(0,b);
}
int Smax(string str)
{
string a,b;
int k = 0;
int i = 5;
while(str[i] != ',' || k)//找到对应的‘,’,‘,’不加入a
{
if(str[i] == 'S') k++;
if(str[i] == ',') k--;
a += str[i++];
}
i++;//跳过','
while(str[i] != ')' || k)//找到对应的')',‘)’不加入b
{
if(str[i] == '(') k++;
if(str[i] == ')') k--;
b += str[i++];
}
i++;//跳过')'
int x,y;
x = solve(0,a);
y = solve(0,b);
int xx = 0,yy = 0;
while(x)
{
xx += x%10;
x/=10;
}
while(y)
{
yy+=y%10;
y/=10;
}
int ans = max(xx,yy);
if(i == str.length())//i指向最后,表示只有一个Smax表达式
return ans;
else
return solve(ans, SOLVE(str,i));//i指向‘)’后面,与后面的做运算
}
int main()
{
int t;
string str;
cin>>t;
while(t--)
{
cin>>str;
cout<<solve(0,str)<<endl;
}
}