表达式求值(栈(操作数栈+操作符栈))

表达式求值

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述

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

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

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

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

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

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

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

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

输入
第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10) 
接下来有N行, 每行是一个字符串,表示待求值的表达式
(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不
超过1000。)
输出
输出有N行,每一行对应一个表达式的值。
样例输入
3
add(1,2) 
max(1,999) 
add(min(1,1000),add(100,99)) 
样例输出
3
999
200

解题思路:

一看表达式的题我就晕,总觉得它太难了,做省赛题发现第四届和第九届都考到,今天特意好好学一下。

看了网上的各种题解:(都是一样的套路(思路))

第一步:两个栈,一个操作符栈,一个操作数栈。

第二步:遇到“)”计算一次,并把结果进存操作数栈,一直循环直至处理完。

代码:

#include<bits/stdc++.h>
using namespace std;
char a[100005];
int check(char a[])
{
    for(int i=0; i<strlen(a); i++)
    {
        if(a[i]<'0'&&a[i]>'9')
            return 0;
    }
    return 1;
}
int cal(char ch,int num1,int num2)
{
    if(ch=='d') return (num1+num2);
    if(ch=='x') return max(num1,num2);
    if(ch=='n') return min(num1,num2);
}
void change(char a[])
{
    stack<char>f;//操作符栈
    stack<int>s;//操作数栈
    char b[100];
    memset(b,'\0',sizeof(b));
    int k=0;
    for(int i=0;a[i]!='\0';i++)
    {
        if(a[i]>='0'&&a[i]<='9')//求每个操作数
            b[k++]=a[i];
        else
        {
            if(k!=0)
            {
                s.push(atof(b));//数进栈
                memset(b,'\0',sizeof(b));
                k=0;
            }
            if(a[i]>='a'&&a[i]<='z')
            {
                f.push(a[i+2]);
                i+=3;
            }
            else if(a[i]==')')//遇到反括号证明可以运算了
            {
                int num1,num2;
                num1=s.top(); s.pop();
                num2=s.top(); s.pop();
                char ch=f.top(); f.pop();
                int res;//计算结果
                res=cal(ch,num1,num2);
                s.push(res);
            }
        }
    }
    printf("%d\n",s.top());
    s.pop();
}
int main()
{
    int num;
    scanf("%d",&num);
    while(num--)
    {
        memset(a,'\0',sizeof(a));
        scanf("%s",a);
        if(check(a)==1)//只有一个X表达式
            printf("%s\n",a);
        else
        change(a);
    }
    return 0;
}
南阳理工有三大表达式求值,打算根据这个思路,开始独立做另外两道。吐舌头


posted @ 2017-04-26 20:03  X_na  阅读(668)  评论(0编辑  收藏  举报