• 表达式求值(后缀表达式求值)


    表达式求值

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:4
     
    描述
    ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。 比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
     
    输入
    第一行输入一个整数n,共有n组测试数据(n<10)。 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。 数据保证除数不会为0
    输出
    每组都输出该组运算式的运算结果,输出结果保留两位小数。
    样例输入
    2
    1.000+2/4=
    ((1+2)*5+1)/4=
    样例输出
    1.50
    4.00
    题解:
    求后缀表达式,用后缀表达式,求解;
    AC代码:
    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    #include<stack>
    using namespace std;
    const int INF=0x3f3f3f3f;
    #define mem(x,y) memset(x,y,sizeof(x))
    #define SI(x) scanf("%d",&x)
    #define PI(x) printf("%d",x)
    typedef long long LL;
    const int MAXN=1010;
    char s[MAXN];
    char work(char a,char b){
        if(a=='#')return '<';
        if(a=='+'||a=='-'){
            if(b=='*'||b=='/'||b=='(')return '<';
            else return '>';
        }
        if(a=='*'||a=='/'){
            if(b=='(')return '<';
            else return '>';
        }
        if(a=='('||a=='=')
        {
            if( (a=='('&&b==')')||(a=='='&&b=='=') ) return '='; 
            else return '<'; 
        } 
    }
    int main(){
        int T;
        SI(T);
        while(T--){
            double temp,p,a,b;
            scanf("%s",s);
            stack<char>S;
            stack<double>s2;
            S.push('#');
            for(int i=0;s[i];){
            //    printf("%c
    ",s[i]);
                if(isdigit(s[i])||s[i]=='.'){
                    temp=0,p=10;
                while(isdigit(s[i])||s[i]=='.'){
                    if(s[i]=='.'){
                        p=0.1;
                        i++;
                        continue;
                    }
                    if(p==10)temp=temp*p+s[i]-'0';
                    else temp=temp+(s[i]-'0')*p,p*=0.1;
                    i++;
                    }
                //    printf("%lf
    ",temp);
                    s2.push(temp);
                }
                    //s2.push(s[i++]);
                else{
                    switch(work(S.top(),s[i])){
                        case '<':
                            S.push(s[i]);
                            i++;
                            break;
                        case '>':
                            a=s2.top();
                            s2.pop();
                            b=s2.top();
                            s2.pop();
                            if(S.top()=='+')
                                s2.push(a+b);
                            else if(S.top()=='-')
                                s2.push(b-a);
                            else if(S.top()=='*')
                                s2.push(a*b);
                            else s2.push(b/a);
                            //printf("%lf
    ",s2.top());
                            S.pop();
                            break;
                        case '=':
                            S.pop();
                            i++;
                        break;
                    }
                }
            }
        //printf("%d %d %lf
    ",S.size(),s2.size(),s2.top());
                printf("%.2lf
    ",s2.top());
            }
        return 0;
    }
  • 相关阅读:
    李航统计学习方法(第二版)(十五):非线性支持向量机与核函数
    Git 工作区、暂存区和版本库
    HTML DOM tabIndex 属性
    HTML DOM Style whiteSpace 属性
    gitcli (Miscellaneous) – Git 中文开发手册
    generator.next (Generator) – JavaScript 中文开发手册
    平均宽度 | min-width (Flexible Box Layout) – CSS 中文开发手册
    chrome console的使用 :评估表达式
    optparse (Operating System) – Python 中文开发手册
    typedArray.findIndex (TypedArray) – JavaScript 中文开发手册
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5236531.html
Copyright © 2020-2023  润新知