表达式求值 【栈的应用 或 二叉树的应用
2015-07-01 09:30
417 查看
#include <iostream> #include <string> #include <stack> #include <fstream> using namespace std; bool isone(char c){ return (c=='+' || c=='-'); } bool istwo(char c){ return (c=='*' || c=='/'); } string shorten(string m){ stack<char> s; string sur; int i; char w; sur; for(i=0;i<m.size();i++){ if(isdigit(m[i]) || m[i]=='.'){ while(isdigit(m[i]) || m[i]=='.') sur += m[i++]; i--; sur += '$'; } else if(isone(m[i])){ while(s.size() && (isone(s.top()) || istwo(s.top()))){ sur+=s.top(); s.pop(); } s.push(m[i]); } else if(m[i]==')'){ while(s.top()!='('){ sur+=s.top(); s.pop(); } s.pop(); } else if(istwo(m[i])){ while(s.size() && istwo(s.top())){ sur+=s.top(); s.pop(); } s.push(m[i]); } else s.push(m[i]); } while(s.size()){ sur+=s.top(); s.pop(); } return sur; } double tentimes(int n){ double res=1; for(int i=0;i<n;i++){ res *= 10; } return res; } double str2double(string s){ double res=0; char c; int dec=0; for(int i=1;i<=s.size();i++){ c=s[i-1]; if(c=='.') dec=i; else if(!dec) res = res*10 + c-'0'; else res += (c-'0')/tentimes(i-dec); } return res; } double calculate(string s){ double res, t; stack<double> num; string temp; int i; for(i=0;i<s.size();i++){ temp=""; if(isdigit(s[i]) || s[i]=='.'){ while(isdigit(s[i]) || s[i]=='.') temp+=s[i++]; //如果最后一位是数字,这样做会出错 num.push(str2double(temp)); } else{ switch (s[i]){ case '+': t=num.top(); num.pop(); t+=num.top();num.pop();num.push(t);break; case '-': t=num.top(); num.pop(); t=num.top()-t;num.pop();num.push(t);break; case '*': t=num.top(); num.pop(); t*=num.top();num.pop();num.push(t);break; case '/': t=num.top(); num.pop(); t=num.top()/t;num.pop();num.push(t);break; default: cerr << "Fatal Error! Result would be wrong!" << endl; system("pause");break; } } } res=num.top(); return res; } int main(){ string mid, sur; cout << "please input:"; cin >> mid; sur = shorten(mid); cout << "successfully executed! The right hand operator expression is: "; cout << sur << endl; cout << "The result is: " <<calculate(sur) << endl; return 0; }
相关文章推荐
- 设置取消缓存
- 终于完成几个淘宝采集相关产品(http://www.9zhai.net/)
- Oracle11g切换语言环境
- JavaScript权威指南_116_第15章_脚本化文档_15.2-选取文档元素-通过CSS类选取元素
- 一个简单的AJAX
- Java转C#,非常不错(转)
- android应用程序的优先级
- python-random模块
- #笔记#圣思园 JavaWeb 第18讲——forward元素,session和request向导式注册,请求转发、重定向
- 理解RESTful架构
- JNI:IO控制及驱动打开与关闭
- android根据Uri获取文件路径
- UIScrollView控件实现图片轮播
- CTO集体怒吼:我到底要不要继续写代码(下篇)
- 浅析C#深拷贝与浅拷贝
- ramps1.4介绍及4988常见问题总结
- VS调试_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));崩溃原因及解决方法 .
- 织梦上传图片失败,提示302错误
- c++ 异常 错误
- Android安全篇