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

表达式求值

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
 
描述
假设表达式定义为: 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
来源
河南省第九届省赛
挺水的一道题,唉当时心态不行啊,被前面的题wa的不想做了;
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
using namespace std;

char judge(char a, char b){
    if(a == '#')return '<';
    if(a == '(' && b == ')')
        return '=';
    if(b == ')')
        return '>';
    if(a == '+'){
        if(b == '*' || b == '(')
            return '<';
        else
            return '>';
    }
    if(a == '*'){
        if(b == '(')
            return '<';
        else
            return '>';
    }
    if(a == '(')return '<';
        
}

bool Is_digit(char c){
    if(c >= '0' && c <= '9')
        return true;
    return false;
}

int work(int a, char c, int b){
    switch(c){
        case '+':
            return a + b;
        case '*':
            return a * b;
    }
}
int Smax(char *s);
int js(char *s){
    stack<char>S;
    stack<int>s2;
    S.push('#');
    for(int i = 0; s[i];){
        if(s[i] == ','){
                while(S.size() > 1){
                    if(s2.size() == 1)return s2.top();
                    int a = s2.top();
                    s2.pop();
                    int b = s2.top();
                    s2.pop();
                    s2.push(work(a, S.top(), b));
                    S.pop();            
                }
            return s2.top();
        }
        else if(s[i] == 'S'){
            int px, cnt = 0, px1;
            for(int j = i; s[j]; j++){
                if(s[j] == '(' && cnt == 0){
                    px1 = j;
                }
                if(s[j] == '(')
                    cnt++;
                else if(s[j] == ')')
                    cnt--;
                if(cnt == 0 && s[j] == ')'){
                    px = j;break;
                }
            }
            s2.push(Smax(s + px1 + 1));
            
            i = px + 1;
        }
        else if(Is_digit(s[i])){
            int temp = 0;
            while(Is_digit(s[i])){
                temp = temp * 10 + s[i] - '0';
                i++;
            }
        //    printf("%d
", temp);
            s2.push(temp);
        }
        else{
            int a, b;
        //    printf("%c %c
", S.top(), s[i]);
            if(S.size() == 1 && s[i] == ')'){
                return s2.top();
            }
            switch(judge(S.top(), s[i])){
                case '<':
                    S.push(s[i]);
                    i++;
                    break;
                case '>':
                    a = s2.top();
                    s2.pop();
                    b = s2.top();
                    s2.pop();
                    s2.push(work(a, S.top(), b));
                    S.pop();
                    break;
            //        printf("%d
", work(a, S.top(), b));
                case '=':
                    S.pop();
                    i++;
            }
        }
    }
    while(S.size() > 1){
        int a = s2.top();
        s2.pop();
        int b = s2.top();
        s2.pop();
        s2.push(work(a, S.top(), b));
        S.pop();            
    }
    return s2.top();
}

int Chenge(int x){
    int temp = 0;
    while(x){
        temp += x % 10;
        x /= 10;
    }
    return temp;
}

int Smax(char *s){
    int px = 0, px2 = 0, cnt = 0;
    for(int i = 0; s[i]; i++){
        if(s[i] == '(')
            cnt++;
        else if(s[i] == ')')
            cnt--;
        if(cnt == 0 && s[i] == ',')
            px = i;
    }
    return max(Chenge(js(s)), Chenge(js(s + px + 1)));
}

int main(){
    int T;
    scanf("%d", &T);
    char s[1010];
    while(T--){
        scanf("%s", s);
        printf("%d
", js(s));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/handsomecui/p/5588920.html