1.读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
2.Input测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
3.Output对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
这道题的难处在于如何判断运算的先后顺序,仔细思考下我们就知道可以利用Stack来存储我们需要的数字,而运算符仅作判断使用。
我们又知道——我们输入的时候先 数字 再 运算符;故可用两个while()进行输入;(因为一开始的输入规则和后面的规则有所区别)
讲一下这道提题的难点。
1.输入格式的把握;
两个while(),先输入数字 cin >> n; 在输入运算符 c=getchar();
或
利用string s; 这就需要多个if()来判断哪些应该是整数并将其转化为数值;(较为复杂,但在第二种方法中使用);
2.运算符的先后;
建一个stack<double> array; 先压数字 ,根据前一个的运算符判断——如果是“ * ”或 “ / ”则把即将压栈的数值和栈的顶值相乘,再压栈;
或
两个栈,一个数值栈,一个运算符栈,写一个函数Compare()比较运算符大小——然后可以直接写运算的方法,不再考虑运算先后;再一个压栈的方法(边压栈,边计算结果);
#include <iostream> #include <map> #include <stack> #include <cstring> #include <cstdio> using namespace std; stack<double> num; int main() { int n; while(cin >> n) { char c; c = getchar(); if(c==' '&&n==0) break; num.push(n); c = getchar(); double m; while(cin >> n) { if(c=='*') { m = num.top(); m *=n; num.pop(); num.push(m); } if(c=='/') { m = num.top(); m/=n; num.pop(); num.push(m); } if(c=='+') { num.push(n); } if(c=='-') { num.push(-n); } if(getchar()==' ') break; c = getchar(); } double sum = 0; while(!num.empty()) { sum+=num.top(); num.pop(); } printf("%0.2lf ",sum); } return 0; }
有所鉴借;