Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0
Sample Output
3.00 13.36
代码:
//http://acm.hdu.edu.cn/showproblem.php?pid=1237
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
stack<int>num;
stack<char>fu;
double sum_num(double x,char a)//递归
{
if(fu.empty())//递归结束条件
{
switch(a)
{
case '*': return x*num.top();break;
case '/': return x/num.top();break;
case '+': return x+num.top();break;
case '-': return x-num.top();break;
}
}
switch(a)
{
case '+':
{
if(fu.top()=='*' || fu.top()=='/')//考虑下一个符号
{
double y=num.top();
num.pop();
char b=fu.top();
fu.pop();
return x+sum_num(y,b);
}
else
{
x+=num.top();
num.pop();
a=fu.top();
fu.pop();
return sum_num(x,a);
}
break;
}
case '-':
{
if(fu.top()=='*' || fu.top()=='/')//考虑下一个符号
{
double y=num.top();
num.pop();
char b=fu.top();
fu.pop();
return x+sum_num(-y,b);//注意:千万不能写成x-sum_num(y,b)
}
else
{
x-=num.top();
num.pop();
a=fu.top();
fu.pop();
return sum_num(x,a);
}
break;
}
case '*':
{
x*=num.top();
num.pop();
a=fu.top();
fu.pop();
return sum_num(x,a);
break;
}
case '/':
{
x/=num.top();
num.pop();
a=fu.top();
fu.pop();
return sum_num(x,a);
break;
}
}
}
int main()
{
string f;
while(getline(cin,f))
{
if(f=="0")
break;
int len=f.size();
while(!num.empty()) //初始化以及清空栈
num.pop();
while(!fu.empty()) //初始化以及清空栈
fu.pop();
int x=0,p=1,j=0, i; //p用来判断一个数字是在这个数的个位十位还是其它,p就是相应10的几次方
for( i=len-1; i>=0; i--) //找到字串中的数
{
if(f[i]>='0' && f[i]<='9')
{
if(i<len-1 && (f[i+1]<'0'||f[i]>'9') )
{
num.push(x); //数入栈
x=0;
p=1;
}
if(i==0)
{
x=x+(f[i]-'0')*p;
num.push(x); //数入栈
}
x=x+p*(f[i]-'0');
p*=10;
}
else if(f[i]=='+' || f[i]=='-' || f[i]=='/' || f[i]=='*')
{
fu.push(f[i]); //符号入栈
}
}
double n=(double)num.top();
num.pop();
char a=fu.top();
fu.pop();
double sum=sum_num(n,a);
//cout<<sum<<endl;
printf("%.2lf\n",sum);
}
return 0;
}