第九届省赛-表达式求值(模拟)

写了四个函数,分别来实现各个功能
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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值