表达式求值2

表达式求值
时间限制:1000 ms | 内存限制:65535 KB
描述
假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式。
2. 如果 X 和 Y 是 表达式,则 X+Y, X*Y 也是表达式; *优先级高于+。
3. 如果 X 和 Y 是 表达式,则函数 Smax(X,Y)也是表达式,其值为:先分别求出 X ,Y值的各位数字之和,再从中选最大数。
4.如果 X 是 表达式,则 (X)也是表达式。例如:表达式 12*(2+3)+Smax(333,220+280) 的值为 69。
请你编程,对给定的表达式,输出其值。
输入
【标准输入】 第一行: T 表示要计算的表达式个数 (1≤ T ≤ 10) 接下来有 T 行,
每行是一个字符串,表示待求的表达式,长度<=1000
输出
【标准输出】 对于每个表达式,输出一行,表示对应表达式的值。
样例输入
3
12+2*3
12*(2+3)
12*(2+3)+Smax(333,220+280)
样例输出
18
60
69

和另一题很相似,那个表达式求值是包含小数的,这个特殊在有一个函数要求,这个还比那个简单点

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stack>
#define maxx(a,b) a>b?a:b 
using namespace std;
int main()
{
    int T;
    char s[1010];
    scanf("%d",&T);
    while(T--)
    {
      stack<char>s1;
      stack<int>s2;
        int i,j;
        getchar();
        scanf("%s",&s[1]);//从第二个空间开始读数 
        int len = strlen(&s[1]);//计算长度 
        s[0]='(';
        s[len+1]=')';
        len++;
        for(i=0;i<=len;i++)
        {
            if(s[i]=='(')
            {
                s1.push(s[i]);//遇见左括号压入栈 
            }
            else if(s[i]=='S')//进入函数 
            {

                s1.push('(');
                s1.push('S');
                i+=4;//Smax 
            }   
            else if(s[i]>='0' && s[i]<='9')//字符转换成数字 
            {
                int v=0;
                while(s[i]>='0' &&s[i]<='9')
                {

                    v=v*10+(s[i++]-'0');
                }
                i--;
                s2.push(v);//压入栈 
            }

            else if(s[i]=='+' ||s[i]=='-')
            {
                while(s1.top()!='(' && s1.top()!='S')
                {
                    int a=s2.top();s2.pop();
                    int b=s2.top();s2.pop();
                    int c;
                    switch(s1.top())
                    {
                        case '+':c=b+a;break;
                        case '-':c=b-a;break;
                        case '*':c=b*a;break;
                        case '/':c=b/a;break;

                    }
                    s2.push(c);
                    s1.pop();
                }
                s1.push(s[i]);
            }   
            else if(s[i]=='*' ||s[i]=='/')
            {
                if(s1.top()=='*')
                {
                    int a=s2.top();s2.pop();
                    int b=s2.top();s2.pop();
                    s2.push(a*b);
                    s1.pop();                       
                }
                else if(s1.top()=='/')
                {
                    int a=s2.top();s2.pop();
                    int b=s2.top();s2.pop();

                    s2.push(b/a);
                    s1.pop();
                }
                    s1.push(s[i]);
            }

            else if(s[i]==')')
                {
                    while(s1.top()!='(' && s1.top()!='S')
                    {
                        int a=s2.top();s2.pop();
                        int b=s2.top();s2.pop();
                        int c;
                        switch(s1.top())
                        {
                            case '+':c=b+a;break;
                            case '-':c=b-a;break;
                            case '*':c=a*b;break;
                            case '/':c=b/a;break;

                        }
                        s2.push(c);
                        s1.pop();
                    }

                    if(s1.top()=='S')
                    {
                        int a=s2.top();s2.pop();
                        int b=s2.top();s2.pop();
                        int c,da=0,db=0;

                        while(b!=0)
                        {
                            db=db+b%10;
                            b/=10;
                        }
                        while(a!=0)
                        {
                            da+=a%10;
                            a=a/10;
                        }
                        c=maxx(da,db);
                        s2.push(c);
                        s1.pop();
                    }
                        s1.pop();

            }

        }
        printf("%d\n",s2.top());
    }
    return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值