• 表达式求值 第九届河南省省赛


    题目链接

    描述

    假设表达式定义为: 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
    

    分析

    还是转换为后缀表达式之后再求值方便,其中Smax的优先级最高

    code

    #include<bits/stdc++.h>
    using namespace std;
    char in[1001];
    char post[1001];
    int pri[200];
    bool isNum(char a)
    {
        if(a>='0'&&a<='9')
            return true;
        return false;
    }
    void zhuan()
    {
        stack<char>op;
        op.push('=');
        int k=0,k1=0;
        for(int i=0; in[i]!=''; i++)
        {
    
            if(in[i]=='m'||in[i]=='a'||in[i]=='x')
                continue;
            if(isNum(in[i]))
            {
                post[k++]=in[i];
                k1++;
            }
            else
            {
                if(k1!=0)
                {
                    post[k++]=' ';
                    k1=0;
                }
                if(in[i]==',')continue;
                if(in[i]=='(')
                    op.push(in[i]);
                else if(in[i]==')')
                {
                    while(op.top()!='(')
                    {
                        post[k++]=op.top();
                        op.pop();
                    }
                    op.pop();
                }
                else
                {
                    while(pri[op.top()]>=pri[in[i]])
                    {
                        post[k++]=op.top();
                        op.pop();
                    }
                    op.push(in[i]);
                 }
            }
    
        }
        while(op.top()!='=')
        {
            post[k++]=op.top();
            op.pop();
        }
        post[k]='';
    }
    int Smax(int a,int b)
    {
        int suma=0;
        while(a)
        {
            suma+=a%10;
            a/=10;
        }
        int sumb=0;
        while(b)
        {
            sumb+=b%10;
            b/=10;
        }
        return max(suma,sumb);
    }
    
    
    int result(int a,int b,char op)
    {
        switch(op)
        {
        case '+' :
            return a+b;
        case '-' :
            return b-a;
        case '*' :
            return a*b;
        case '/' :
            return b/a;
        case 'S' :
            return Smax(a,b);
        }
    }
    
    int jisuan()
    {
        stack<int>num;
        int sum=0;
        for(int i=0; post[i]; i++)
        {
            if(isNum(post[i]))
                sum=sum*10+post[i]-'0';
            else
            {
                if(sum!=0)
                {
                    num.push(sum);
                    sum=0;
                }
                if(post[i]!=' ')
                {
                    int a=num.top();
                    num.pop();
                    int b=num.top();
                    num.pop();
                    num.push(result(a,b,post[i]));
                }
            }
        }
        return num.top();
    }
    
    int main()
    {
       // freopen("2.txt","r",stdin);
    
        pri['=']=0;
        pri['(']=1;
        pri['+']=2;
        pri['-']=2;
        pri['*']=3;
        pri['/']=3;
        pri['S']=4;
        int t;
        scanf("%d",&t);
        while(t--)
        {
            memset(in,0,sizeof(in));
            memset(post,0,sizeof(post));
            scanf(" %s",in);
            zhuan();
            //puts(post);
            printf("%d
    ",jisuan());
        }
    
        return 0;
    }
    
  • 相关阅读:
    关于lockkeyword
    关于多层for循环迭代的效率优化问题
    Android 面试精华题目总结
    Linux基础回想(1)——Linux系统概述
    linux源代码编译安装OpenCV
    校赛热身 Problem C. Sometimes Naive (状压dp)
    校赛热身 Problem C. Sometimes Naive (状压dp)
    校赛热身 Problem B. Matrix Fast Power
    校赛热身 Problem B. Matrix Fast Power
    集合的划分(递推)
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/6762643.html
Copyright © 2020-2023  润新知