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

题目链接

描述

假设表达式定义为: 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]!='\0'; 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]='\0';
}
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\n",jisuan());
    }

    return 0;
}
posted @ 2017-04-25 16:08  -梦里不知身是客  阅读(167)  评论(0编辑  收藏  举报