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

表达式求值

时间限制: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;
}

时间: 2024-10-12 09:07:38

第九届省赛-表达式求值(模拟)的相关文章

河南省第四届acm省赛 表达式求值(栈的应用)

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式. 假设表达式可以简单定义为: 1. 一个正的十进制数 x 是一个表达式. 2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y

NYOJ-305 表达式求值(模拟)

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式. 假设表达式可以简单定义为: 1. 一个正的十进制数 x 是一个表达式. 2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y

nyoj1273 河南省第九届省赛_&quot;宣传墙&quot;、状压DP+矩阵幂加速

宣传墙 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做一系列的宣传.为了统一规划,CBA 镇长要求每个宣传栏只能占相邻的两个方格 位置.但这条道路被另一条道路分割成左右两段.CBA 镇长想知道,若每个位置都贴上宣传栏, 左右两段各有有多少种不同的张贴方案. 例如: N=6,M=3, K=2, 左,右边各有 5 种不同的张贴方案 输入 第一行: T 表示

表达式求值 (栈应用)

简单计算器 Description 计算一个算术表达式的值.(式子中每个数都是一位数,且除法运算时整除,即3/2=1.输入数据保证每个表达式合法.) Input 有多组测试样例.一个算术表达式占一行. Output 输出表达式的值. Sample Input 1+1 2*3 Sample Output 2 6 分析:就是一个含有加减乘除的表达式,并且不含有括号,计算其值.明明是很简单的表达式求值,愣是让我水了几个小时,也是醉了...看来真是老了 表达式求值:1.先按照计算法则,给出各运算符的优先

表达式求值:从“加减”到“带括号的加减乘除”的实践过程

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee ● 为什么想做一个表达式求值的程序 最近有一个需求,策划想设置游戏关卡的某些数值,这个数值不是一个常量,而是根据关卡的某些环境数据套上一个计算表达式算出来的.这个需求无法用excel拖表预计算出,因为关卡的环境数据只有在游戏中才能产生,在excel制表时,这些都是未知的.作为程序员,我可以把计算表达式硬编码在代码中,但这个做法有缺陷,如果策划要修改计算表达式的话,只能通过我修改程序并

使用E.W.D.Dijkstra设计算法实现算数表达式求值

要求:编程模拟(1+(2+3)*(4*5))的运算过程,重点在于如何解析由括号运算符和数字组成的字符串,并按照正确的顺序完成各种初级运算符的操作. 实现思路:用两个栈(LIFO)结构来实现(一个用于保存运算符,一个用于保存操作数) 将操作数压如操作数栈 将操作符压如操作符栈 忽略左括号 在遇到右括号时,弹出一个运算符,并弹出所需数量的操作数,并将操作符和操作数的运算结果压到操作数栈 1 package com.luochuang.demo.stdlib; 2 3 public class Eva

Python解析 算数表达式求值 栈的使用

使用Python实现一种算数表达式求值的算法,模拟这种使用栈的方式,这是由E.W.Dijkstra在20世纪60年代发明的一种非常简单的算法.代码模拟仅仅表现一种编程思想,代码的逻辑并不完全: if __name__ == "__main__": cal_str = input("请输入算数表达式(e.g.(((1+2)*(3+5))+2), 只适合简单的算数表达式):") num_stack = [] symbol_stack = [] for chr in ca

四则运算表达式求值 OpenJ_Bailian - 4132

四则运算表达式求值 OpenJ_Bailian - 4132 题意:设计一个计算器,实现+-*/以及()的表达式运算求值. 栈的应用,这学期学数据结构,手写了栈练一下~ 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=10010; //最大表达式长度 4 5 template <typename T> 6 class Stack; 7 8 template <typename T> 9

表达式求值

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,近期又学会了一些简单的函数求值,比方,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式. 如果表达式能够简单定义为: 1. 一个正的十进制数 x 是一个表达式. 2. 假设 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x