表达式求值
来源:互联网 发布:数控锥度编程 编辑:程序博客网 时间:2024/06/09 18:49
题目:ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
思路:这是关于栈的应用,采用的是后缀表达式。关于“( )”的处理 ,“(”是拥有最高的优先级,因此会被放进栈中,除非正在处理“)”否则“(”是不会弹出的。当读到“)”,将栈中的元素直到“)”弹出。运算符的优先级处理,当操作符栈的栈顶元素比读到的元素的优先级低的话,不会输出且该元素进栈,如果比读到元素的优先级高的话,栈顶元素弹出,然后将读到的元素压入栈中。(AC通过)
#include <iostream> #include <string> #include <stack> #include <fstream> using namespace std; bool isAS(char c){ return (c=='+' || c=='-'); } bool isMD(char c){ return (c=='*' || c=='/'); } string transform(string m){ stack<char> s; string str; int i; char w; for(i=0;i<m.size();i++){ if(m[i]=='='){ break; } if(isdigit(m[i]) || m[i]=='.'){ while(isdigit(m[i]) || m[i]=='.') str += m[i++]; i--; str += '$'; } else if(isAS(m[i])){ while(s.size() && (isAS(s.top()) || isMD(s.top()))){ str+=s.top(); s.pop(); } s.push(m[i]); } else if(m[i]==')'){ while(s.top()!='('){ str+=s.top(); s.pop(); } s.pop(); } else if(isMD(m[i])){ while(s.size() && isMD(s.top())){ str+=s.top(); s.pop(); } s.push(m[i]); } else s.push(m[i]); } while(s.size()){ str+=s.top(); s.pop(); } return str; } double multen(int n){ double res=1; for(int i=0;i<n;i++){ res *= 10; } return res; } double strDouble(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')/multen(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(strDouble(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; } } } res=num.top(); return res; } int main(){ int t; string str, postfix; cin>>t; while(t--){ cin>>str; postfix = transform(str); cout.precision(2); cout<<fixed; cout<<calculate(postfix)<<endl; //printf("%0.2f",calculate(postfix)); } return 0; }
阅读全文
0 0
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- day25(单例模式,多线程通信,线程组,线程状态,线程池,工厂模式)
- java克隆
- 解决安装php过程中出现的问题
- JavaScript 函数++
- PE安装及制作教程
- 表达式求值
- HDOJ 基础动归汇总 ,持续更新题目,一路打怪升级
- IDEA中Maven报错NoClassDefFoundError
- 《大话数据结构》学习笔记--chapter 6
- 关于Spring MVC中的表单标签库的使用
- Codeforces Round #401 (Div. 2) D. Cloud of Hashtags【模拟、贪心】
- hibernate_2
- 8.10-8.11训练总结
- BZOJ 4756 Promotion Counting(线段树合并 || dfs)