求解表达式的值 表达式树的运用
来源:互联网 发布:php rename 失败 编辑:程序博客网 时间:2024/05/09 00:30
1061: 求解表达式的值
Time Limit: 1 Sec Memory Limit: 10 MBSubmit: 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
1*2+(5.0/2)
50/100+1*1.23
Sample Output
2.00
4.50
1.23
这题有两个难点,第一个难点就是处理浮点型,我的思路就是直接把浮点型处理为string;第二个难点就是“严格按照C语言的运算规则”求解表达式的值,从第三个测试样例可以看出,int型与int型运算仍为int,那么就用一个结构体存储答案和这个数的类型,在进行除法时特别判断一下它的类型就可以了。
AC代码:
如有不当之处欢迎指出!
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
- 求解表达式的值 表达式树的运用
- 利用二叉树求解表达式的值
- 递归表达式的求解
- 逻辑表达式的运用
- struts2 表达式的运用
- 正则表达式的运用
- poj3295(前缀表达式的运用和递归求解表达式)解题报告
- 求解算术表达式结合二叉树的后缀表达式问题
- 逆波兰表达式的求解
- JAVA正则表达式的运用
- linux正则表达式的运用
- linux正则表达式的运用
- 后缀表达式 栈的运用
- 三目表达式的运用
- 正则表达式的简单运用
- js正则表达式的运用
- 注册正则表达式的运用
- 三元表达式的巧妙运用
- 构建高并发高可用的电商平台架构实践
- 拉链法处理哈西冲突
- ubuntu访问国外网站
- 在64位机器上使用返回值为地址的函数要注意声明函数体
- 当linux报 “-bash: fork: 无法分配内存”
- 求解表达式的值 表达式树的运用
- OpenGL程序:使用裁剪框渲染一组三角形
- 安卓关于设计模式_装饰者模式
- Android Studio简单设置
- ZooKeeper学习笔记-2---ZooKeeper部署与运行
- java.net.BindException: Address already in use: JVM_Bind <null>:1099
- iOS开发 ☞ Masonry的那些坑
- Asp.net中利用NPOI做Excel导出功能
- 基于【程序员哪些事】微信公众号《如何准备阿里社招面试,顺谈Java程序员学习中各阶段的建议》中的罗列问题的总结