读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
代码如下:
#include<cstdio>
#include<iostream>
#include<string.h>
#include<stack>
using namespace std;
int main(){
char ch[420];
while(cin.getline(ch,sizeof(ch))&&strcmp(ch,"0")){
stack<char>s;
stack<double>n;
int num=strlen(ch);
for(int i=0;i<num;i++){
if(ch[i]>='0'&&ch[i]<='9'){
double tem=0;
while(ch[i]>='0'&&ch[i]<='9'){
tem=tem*10+ch[i++]-'0';
}
n.push(tem);
}else if(ch[i]=='+'||ch[i]=='-'){
while(!s.empty()){
char c=s.top();
s.pop();
double x1=n.top();
n.pop();
double x2=n.top();
n.pop();
if(c=='+')x2+=x1;
else x2-=x1;
n.push(x2);
}
s.push(ch[i]);
}else if(ch[i]=='*'||ch[i]=='/'){
double tem=0;
int j=i;
i+=2;
while(ch[i]>='0'&&ch[i]<='9'){
tem=tem*10+ch[i++]-'0';
}
double x1=n.top();
n.pop();
if(ch[j]=='*')x1*=tem;
else x1/=tem;
n.push(x1);
}
}
while(!s.empty()){
char c=s.top();
s.pop();
double x1=n.top();
n.pop();
double x2=n.top();
n.pop();
if(c=='+')x2+=x1;
else x2-=x1;
n.push(x2);
}
printf("%.2lf\n",n.top());
}
return 0;
}