hdu1237(STL)

来源:互联网 发布:火牛软件 编辑:程序博客网 时间:2024/06/06 06:53

简单计算器

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 + 24 + 2 * 5 - 7 / 110
 

Sample Output
3.0013.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();}elsebreak;}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;}

原创粉丝点击