1019.简单计算器

来源:互联网 发布:云计算产品有哪些 编辑:程序博客网 时间:2024/05/17 19:18
题目描述:
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:
3.00

13.36


关于四则运算,这里可以引申一下几个概念,中缀表达式,后缀表达式。一般我们的四则运算,给出的表达式是中缀表达式,而我们求解四则运算的方法就是先把中缀表达式转换成后缀表达式,再求得结果。无论是中缀表达式转换成后缀表达式,还是后缀表达式求结果,都用到了栈。


中缀转后缀(栈存储操作符):如果遇到操作数,直接输出。如果遇到操作符,那么从栈中弹出元素直到发现优先级更低的元素为止。(例外:除非是在处理")",否则绝不移走"(",所以"("的优先级最高。)再将操作符压入栈中。如督导文件末尾,再将栈元素弹出变成空栈写到输出中。举例: 1 + 2 * 3 ,则转换成的后缀表达式为1 2 3 * +  。


后缀求结果(栈存数字):当遇到一个数字的时候就存入栈中,当遇到一个操作符时,把该操作符作用于从栈弹出来的两个数上,再将所得结果压入栈中。最后把栈顶元素输出(此时栈也只有一个元素了)即为这个四则运算的结果。


这是我很久以前写过的代码,还可以包含括号,AC了。

#include <iostream>#include <vector>#include <string>#include <stack>#include <sstream>#include <cstdlib>using namespace std;int Judge(const string& sval)  //判断一个字符串是否为数字  这个比atoi好用 atoi不能识别字符串0{int val;stringstream ss;ss << sval;ss >> val;if(ss.fail())return -1;return val;}double evalPostFix(const vector<string> &str)   //后缀表达式计算结果  栈存的是数字{stack<double> s;for(int i = 0; i != str.size(); ++i){if(Judge(str[i]) != -1)  //如果字符串为数字 则放入栈中s.push(atoi(str[i].c_str()));else if(str[i] == "+"){double a = s.top();s.pop();double b = s.top();s.pop();s.push(b + a);}else if(str[i] == "-"){double a = s.top();s.pop();double b = s.top();s.pop();s.push(b - a);}else if(str[i] == "*"){double a = s.top();s.pop();double b = s.top();s.pop();s.push(b * a);}else if(str[i] == "/"){double a = s.top();s.pop();double b = s.top();s.pop();if(a == 0){cout << "0不能作除数" << endl;continue;}s.push(b / a);}elsecontinue;}return s.top();}vector<string> inToPostfix(const vector<string> &str)  //中缀表达式转后缀表达式  栈存的是符号{stack<string> s;vector<string> e;for(int i = 0; i != str.size(); ++i){if(Judge(str[i]) != -1)  //如果该字符串为数字  则放入输出中e.push_back(str[i]);else   //挨个分析运算符,共六种{if(str[i] == "(")  //因为(优先级最高 所以下面的while判断都要进行s.push("(");else if(str[i] == ")"){while(!s.empty() && s.top() != "("){e.push_back(s.top());s.pop();}s.pop(); //把"("出栈}else if(str[i] == "+" || str[i] == "-")  {while(!s.empty() && s.top() != "(")  //如果输入的是 "+" 或"-",则把栈中所有元素拿出 因为不可能有优先级更低了的!{e.push_back(s.top());s.pop();}s.push(str[i]);}else if(str[i] == "*" || str[i] == "/"){while(!s.empty() && s.top() != "(" && (s.top() == "*" || s.top() == "/"))    //如果输入的是"*"或"/",则只能处理栈中的*或/{e.push_back(s.top());s.pop();}s.push(str[i]);}elsecontinue;}}while(!s.empty()) //导出栈中的所有符号{e.push_back(s.top());s.pop();}return e;}int main(){string str,a;vector<string> zhongzhui,houzhui;while(getline(cin,str)){if(str == "0")break;istringstream in(str);while(in >> a)zhongzhui.push_back(a);houzhui = inToPostfix(zhongzhui);cout.setf(ios::fixed);cout.precision(2);cout << evalPostFix(houzhui) << endl;zhongzhui.clear();houzhui.clear();}return 0;}





0 0
原创粉丝点击