zoukankan      html  css  js  c++  java
  • 第九届省赛-表达式求值(模拟)

    表达式求值

    时间限制: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;
    }
  • 相关阅读:
    jqGrid api 中文说明
    jsp + js + 前端弹出框
    js中关于带数字类型参数传参丢失首位数字0问题
    java中WGS84坐标(ios)转换BD-09坐标(百度坐标)
    Java中的“浅复制”与“深复制”
    Git错误:error:failed to push some refs to 'git@gitee.com:name/project.git'
    git操作教程
    线程调度及进程调度
    同步锁Lock
    多线程案例
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5588920.html
Copyright © 2011-2022 走看看