zoukankan      html  css  js  c++  java
  • 表达式求值 第九届河南省省赛

    题目链接

    描述

    假设表达式定义为: 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;
    }
    
  • 相关阅读:
    Decision Tree、Random Forest、AdaBoost、GBDT
    正则化:L0 vs L1 vs L2
    处理不平衡数据的基本方法
    常用的评价指标:accuracy、precision、recall、f1-score、ROC-AUC、PR-AUC
    创建以mybatis为基础的web项目(1)
    [.Net] C# Excel操作类 ExcelHelper
    [.Net] C#开发微信门户及应用之微信菜单的多种表现方式介绍
    [.Net] Excel导入导出各种方式分析
    [Javascript] 轻量级的JavaScript日期处理类库xDate使用指南
    [Javascript] 40个轻量级JavaScript脚本库
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/6762643.html
Copyright © 2011-2022 走看看