表达式求值

时间限制: 3000 ms  |  内存限制:65535 KB
难度: 3
 
<dl class="problem&#45;display"> <dt> 描述 </dt> <dd>

Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。

假设表达式可以简单定义为:

1. 一个正的十进制数 x 是一个表达式。

2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。

3. 如果 x 和 y 是 表达式,则 函数max(x,y )也是表达式,其值为x,y 中的最大数。

4.如果 x 和 y 是 表达式,则 函数add(x,y )也是表达式,其值为x,y 之和。

例如, 表达式 max(add(1,2),7) 的值为 7。

请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。

</dd> </dl>
 
<dl class="others"> <dt> 输入 </dt> <dd> 第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10) 
接下来有N行, 每行是一个字符串,表示待求值的表达式
(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不
超过1000。) </dd> <dt> 输出 </dt> <dd> 输出有N行,每一行对应一个表达式的值。 </dd> <dt> 样例输入 </dt> <dd>
3
add(1,2) 
max(1,999) 
add(min(1,1000),add(100,99)) 
</dd> <dt> 样例输出 </dt> <dd>
3
999
200
解题思路:分类讨论,遇到什么符号分别进行什么样的操作。。。
</dd> </dl>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>

using namespace std;

int main()
{
    int n;
    scanf("%d",&n);
    while(n--){
        stack<char> s1;
        stack<int> s2;
        char a[305];
        scanf("%s",a);
        int len=strlen(a);
        for(int i=0;i<len;i++){
            if(a[i]=='('||a[i]==','){
                continue;
            }
            if(a[i]=='m'&&a[i+1]=='a'){
                s1.push('1');
                i+=2;
            }
            if(a[i]=='m'&&a[i+1]=='i'){
                s1.push('2');
                i+=2;
            }
            if(a[i]=='a'&&a[i+1]=='d'){
                s1.push('3');
                i+=2;
            }
            if(a[i]>='0'&&a[i]<='9'){
                int k=0;
                while(a[i]>='0'&&a[i]<='9'){
                    k=k*10+(a[i]-'0');
                    i++;
                }
                s2.push(k);
                i--;
            }
            if(a[i]==')'){
                int t1=s2.top();
                s2.pop();
                int t2=s2.top();
                s2.pop();
                if(s1.top()=='1'){
                    s1.pop();
                    s2.push(t1>t2?t1:t2);
                    continue;
                }
                if(s1.top()=='2'){
                    s1.pop();
                    s2.push(t1<t2?t1:t2);
                    continue;
                }
                if(s1.top()=='3'){
                    s1.pop();
                    s2.push(t1+t2);
                    continue;
                }
            }
        }

        printf("%d\n",s2.top());
        s2.pop();
    }
    return 0;
}