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

Posted handsomecui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第九届省赛-表达式求值(模拟)相关的知识,希望对你有一定的参考价值。

表达式求值

时间限制: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\n", temp);
            s2.push(temp);
        }
        else{
            int a, b;
        //    printf("%c %c\n", 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\n", 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\n", js(s));
    }
    return 0;
}

 

以上是关于第九届省赛-表达式求值(模拟)的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥日记②2018第九届省赛(软件类)JavaA组★答案解析

[UPC] 山东省第九届省赛 Games | dp

机械设备--第九届省赛--深搜

2018山东第九届省赛总结与反思

山东省第九届省赛G题game

NYOJ--1276--机器设备(河南省第九届省赛,简单的bfs)