简单计算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 24273 Accepted Submission(s): 8794
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
Source
#include <iostream> #include <stack> #include <string> #include <cstdio> using namespace std; stack<double> opnd; //运算对象栈 stack<char> optr; //运算符号栈 void f() //取栈顶元素运算 { double tmp; char key=optr.top(); optr.pop(); double x=opnd.top(); opnd.pop(); double y=opnd.top(); opnd.pop(); switch(key) { case ‘+‘: tmp=x+y; break; case ‘-‘: tmp=y-x; break; case ‘*‘: tmp=x*y; break; case ‘/‘: tmp=y/x; break; } opnd.push(tmp); } int main() { double a,ans=0; char t,b; while(scanf("%lf",&a)==1) { opnd.push(a); scanf("%c",&t); if(a==0&&t==‘\n‘) //结束循环 break; while(scanf("%s %lf",&b,&a)==2) { char ch=getchar(); //读入数字后面的字符 while(1) { if(optr.empty()||((b==‘*‘||b==‘/‘)&&(optr.top()==‘+‘||optr.top()==‘-‘))) { optr.push(b); //栈空或下一个运算符优先级更高,入栈 opnd.push(a); break; } else //否则取栈顶元素运算然后运算符入栈 f(); } if(ch==‘\n‘) //输出结果 { while(!optr.empty()) { f(); } ans=opnd.top(); printf("%.2lf\n",ans); while(!opnd.empty()) //多组测试数据,清空栈 { opnd.pop(); } while(!optr.empty()) { optr.pop(); } break; } } } return 0; }
这题至少整了两天,一开始是为了练一练STL,熟悉熟悉应用的,然后发现数据结构教科书上P87的例题写错了,只能进行10以内的加减乘除运算,除法还没法保持精度,然后这题一开始敲的时候就是整体将表达式读入,再处理的,没有注意到题中的每个符号之间都有一个空格,这能很好的简化题目,否则就得考虑字符串转化为数字的处理,手动模拟数字乘位权值;(这里,题目也没给清楚表达式里数字的范围,= =有想到java的大数浮点型)。最后终于AC了。。。