nyoj 35 表达式求值<模拟+栈>
2016-06-16 21:32
495 查看
表达式求值
时间限制: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
来源数据结构课本例题改进
上传者张云聪
模拟+栈
代码:
#include<cstdio> #include<cmath> #include<stack> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char ch[1010]; int chang,i,a,b; char lp; double hao(); double sh(); double hao() { double a,b; stack<char> fu; stack<char> hfu; stack<double> shu; stack<double> hshu; i++;int kkp=0; for (;ch[i]!=')';i++) { if (ch[i]=='(') shu.push(hao()); else if (ch[i]>='0'&&ch[i]<='9') shu.push(sh()); else if (fu.empty()) fu.push(ch[i]); else { lp=fu.top(); fu.pop(); if (lp=='*'||lp=='/') { a=shu.top(); shu.pop(); b=shu.top(); shu.pop(); if (lp=='*') b*=a; else b/=a; shu.push(b); } else { fu.push(lp); } fu.push(ch[i]); } } if (!fu.empty()) { lp=fu.top(); fu.pop(); if (lp=='*'||lp=='/') { a=shu.top(); shu.pop(); b=shu.top(); shu.pop(); if (lp=='*') b*=a; else b/=a; shu.push(b); } else { fu.push(lp); } } while (!fu.empty()) { lp=fu.top(); fu.pop(); hfu.push(lp); } while (!shu.empty()) { a=shu.top(); shu.pop(); hshu.push(a); } while (!hfu.empty()) { lp=hfu.top(); hfu.pop(); a=hshu.top(); hshu.pop(); b=hshu.top(); hshu.pop(); if (lp=='+') a+=b; else a-=b; hshu.push(a); } a=hshu.top(); return a; } double sh()//注意小数。。 { double kkp=0,kp=-1.0;int k=0; for (;(ch[i]<='9'&&ch[i]>='0')||ch[i]=='.';i++) { if (ch[i]=='.') k=1; else { if (!k) kkp=kkp*10+ch[i]-'0'; else { kkp=kkp+double(ch[i]-'0')*pow(10.0,kp); kp--; } } } i--; return kkp; } double suan() { double a,b; stack<char> fu; stack<double> shu; stack<char> hfu; stack<double> hshu; chang=strlen(ch);chang--; for (i=0;i<chang;i++) { if (ch[i]=='(') shu.push(hao()); else if (ch[i]>='0'&&ch[i]<='9') shu.push(sh()); else if (fu.empty()) fu.push(ch[i]); else { lp=fu.top(); fu.pop(); if (lp=='*'||lp=='/') { a=shu.top(); shu.pop(); b=shu.top(); shu.pop(); if (lp=='*') b*=a; else b/=a; shu.push(b); } else { fu.push(lp); } fu.push(ch[i]); } } if (!fu.empty()) { lp=fu.top(); fu.pop(); if (lp=='*'||lp=='/') { a=shu.top(); shu.pop(); b=shu.top(); shu.pop(); if (lp=='*') b*=a; else b/=a; shu.push(b); } else { fu.push(lp); } } while (!fu.empty()) { lp=fu.top(); fu.pop(); hfu.push(lp); } while (!shu.empty()) { a=shu.top(); shu.pop(); hshu.push(a); } while (!hfu.empty()) { lp=hfu.top(); hfu.pop(); a=hshu.top(); hshu.pop(); b=hshu.top(); hshu.pop(); if (lp=='+') a+=b; else a-=b; hshu.push(a); } a=hshu.top(); return a; } int main() { int t;scanf("%d",&t); while (t--) { scanf("%s",ch); double s=suan(); printf("%.2lf\n",s); } return 0; }
相关文章推荐
- hdu 2089 入门数位dp
- 技术人员如何创业《四》- 打造超强执行力团队
- RuntimeException: Canvas: trying to use a recycled bitmap
- Deep Learning(深度学习)学习笔记整理系列之(三)
- Java编译时注解自动生成代码
- C#局域网内UDP广播获取获取JSON数据并解析
- org.hibernate.hql.ast.QuerySyntaxException: XX is not mapped !
- java GUI计算器
- 技术人员如何创业《三》- 合伙人的分工
- Linux异步通知 fasync
- 调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配
- 新冲刺Sprint3(第二天)
- 整理项目中使用的开源项目
- matlab + mnist 调用训练好的caffe模型进行手写体识别
- png 2 icon
- 第三方服务器用PHP验证GameCenter GKLocalPlayer返回的签名
- 技术人员如何创业《二》- 合伙人的模式
- 菜单编辑器
- python数据类型详解
- python两个文件的对比