求解表达式的值 表达式树的运用

来源:互联网 发布:php rename 失败 编辑:程序博客网 时间:2024/05/09 00:30

1061: 求解表达式的值

Time Limit: 1 Sec  Memory Limit: 10 MB
Submit: 3  Solved: 2
[Submit][Status][Web Board]

Description

求解一个混合表达式的值,注意要求严格按照C语言的运算规则来求解表达式的值。

Input

 输入一个混合表达式,为了问题简单表达式中只包含+(加),-(减),*(乘),/(除)以及整数、小数和括号。

Output

 输出该表达式的值,结果保留到小数点后两位。

Sample Input

1+1
1*2+(5.0/2)
50/100+1*1.23

Sample Output

2.00
4.50
1.23
这题有两个难点,第一个难点就是处理浮点型,我的思路就是直接把浮点型处理为string;第二个难点就是“严格按照C语言的运算规则”求解表达式的值,从第三个测试样例可以看出,int型与int型运算仍为int,那么就用一个结构体存储答案和这个数的类型,在进行除法时特别判断一下它的类型就可以了。
AC代码:
#include<cstdio>#include<string>#include<cstring>#include<cmath>#include<iostream>using namespace std;const int maxn=1000+5;char s[maxn];string op[maxn];int r[maxn],l[maxn];int nc=0,n,fla=0;string w[maxn];struct node{    int flag;    double ans;    node(int x,double y):flag(x),ans(y){}};int mart(){    int ind=0;    for(int i=0;i<n;++i){        if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||s[i]==')'||s[i]=='(')            w[ind++]=s[i];        else {            w[ind]="";            while(s[i]>='0'&&s[i]<='9'||s[i]=='.'){                w[ind]+=s[i++];            }            ++ind;            --i;        }    }    return ind;}inline double get(string p){    fla=0;    double ans=0;    int h=0,len=p.size();    for(int i=0;i<len;++i){        if(p[i]=='.') {h=i;continue;}        ans=ans*10+(p[i]-'0');    }    if(h!=0) {fla=1;return ans/pow(10,len-h-1);}    return ans;}int build_tree(int x,int y){    int c1=-1,c2=-1,p=0;    int u;    if(y-x==1){        u=++nc;        l[u]=r[u]=0;        op[u]=w[x];        return u;    }    for(int i=x;i<y;++i){        if(w[i]=="(") p++;        else if(w[i]==")") p--;        else if(w[i]=="+"||w[i]=="-"){            if(!p) c1=i;        }        else if(w[i]=="*"||w[i]=="/"){            if(!p) c2=i;        }    }    if(c1<0) c1=c2;    if(c1<0) return build_tree(x+1,y-1);    u=++nc;    l[u]=build_tree(x,c1);    r[u]=build_tree(c1+1,y);    op[u]=w[c1];    return u;}node solve(int u){    if(l[u]==0&&r[u]==0) {        double v=get(op[u]);        return node(fla,v);    }    node p1=solve(l[u]);    node p2=solve(r[u]);    double ll=p1.ans,rr=p2.ans;    fla=0;    if(p1.flag||p2.flag) fla=1;    if(op[u]=="+") return node(fla,ll+rr);    if(op[u]=="-") return node(fla,ll-rr);    if(op[u]=="*") return node(fla,ll*rr);    if(op[u]=="/") {        if(fla) return node(fla,ll/rr);        else {            int a=ll,b=rr;            return node(fla,a/b);        }    }}int main(){    while(scanf("%s",s)==1){        nc=0;        n=strlen(s);        n=mart();        int root=build_tree(0,n);        printf("%.2f\n",solve(root).ans);    }    return 0;}

如有不当之处欢迎指出!


0 0
原创粉丝点击