简单计算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10564 Accepted Submission(s): 3407
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0
Sample Output
3.00 13.36本题是个简易表达式的计算问题,将操作数和操作符分别入不同的两个栈,读入一个操作数则直接入栈,读入一个操作符则与当前操作符栈顶元素比较,若小于则栈顶元素操作符出栈,操作数栈顶两元素出栈进行运算后入数栈,直至读入操作符大于等于当前操作符栈顶操作符优先级。处理直到字符为空且操作符栈为空,此时操作数栈只剩最终答案。#include<iostream> #include<stack> #include<cstdio> #include<cstring> #include<string> using namespace std; void trans(string &str) { int i; stack<double>num; stack<char>op; double a1; double a2; char ch; for(i=0;i<str.size();i++) { if(str[i]==' ') { continue; } else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/') { while(!op.empty()) { ch=op.top(); if((ch=='+'||ch=='-')&&(str[i]=='+'||str[i]=='-')||(ch=='*'||ch=='/')) { a1=num.top();num.pop(); a2=num.top();num.pop(); if(ch=='+') { a2=a1+a2; num.push(a2); } else if(ch=='-') { a2=a2-a1; num.push(a2); } else if(ch=='*') { a2=a2*a1; num.push(a2); } else { a2=a2/a1; num.push(a2); } op.pop(); } else break; } op.push(str[i]); } else { int a=0; while(str[i]>='0'&&str[i]<='9') { a=a*10+str[i]-'0'; i++; } num.push((double)(a)); i--;// } } while(!op.empty()) { ch=op.top(); a1=num.top();num.pop(); a2=num.top();num.pop(); if(ch=='+') { a2=a1+a2; num.push(a2); } else if(ch=='-') { a2=a2-a1; num.push(a2); } else if(ch=='*') { a2=a2*a1; num.push(a2); } else { a2=a2/a1; num.push(a2); } op.pop(); } printf("%.2lf\n",num.top()); } int main() { string str; while(getline(cin,str)) { if(str=="0") break; trans(str); } return 0; }