//stack应用:表达式求值
/*
//不知道错哪了:一直说我有段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起
//此方法没有考虑整数是多位数!!
#include <iostream>
#include <stack>
using namespace std;
int main()
{
stack<double> num;
stack<char> fu;
string ans;
fu.push('#');
while(cin>>ans)
{
if(ans=="0")break;
for(int i=0;i<ans.size();i++)
{
if(ans[i]!=' ')
{
if((ans[i]-'0')>=0&&(ans[i]-'0')<=9)
{
num.push(ans[i]-'0');
// cout<<num.top()<<" ";//
}
else
{
fu.push(ans[i]);
// cout<<fu.top()<<" ";//
}
}
}
while(fu.top()!='#')/////判断条件
{
double number=num.top();//暂存数字
num.pop();
if(fu.top()=='/'||fu.top()=='*')
{
char fuhao=fu.top();//暂存符号
fu.pop();
double n2;
if(fuhao=='/')
{
n2=num.top();
num.pop();
double n3=(n2*1.0)/(number);
num.push(n3);
}
else if(fuhao=='*')
{
n2=num.top();
num.pop();
double n3=(n2*1.0)*(number);
num.push(n3);
}
}
else if(fu.top()=='+'||fu.top()=='-')
{
char fu1;//暂存栈顶符号
fu1=fu.top();
fu.pop();
if(fu.top()=='+'||fu.top()=='-'||fu.empty())
{
double shu1;
shu1=num.top();
num.pop();
if(fu1=='+')
{
shu1=shu1+number;
}
else
{
shu1=shu1-number;
}
num.push(shu1);
}
else if(fu.top()=='/'||fu.top()=='*')
{
double shuh;//5
double shuq;//2
shuh=num.top();
num.pop();
shuq=num.top();
num.pop();
if(fu.top()=='/')
{
shuq=shuq*1.0/shuh;
num.push(shuq);
}
else{
shuq=shuq*1.0*shuh;
num.push(shuq);
}
fu.pop();
num.push(number);
fu.push(fu1);
}
}
}
printf("%.2f\n",num.top());
}
return 0;
}
*/
#include <iostream>
#include <stack>
#include <cctype>
using namespace std;
int Prior(char x)
{
if(x=='#')return 1;
else if(x=='$')return 2;
else if(x=='+'||x=='-')return 3;
else return 4; //else if(x=='*'||x=='/')return 4; //写成这样会报错,说函数没有返回值
}
double GetNumber(string str,int& index)//传引用,形参变化,实参也变
{
double number=0;
while(isdigit(str[index]))
{
number=number*10+str[index]-'0';
index++;
}
return number;
}
double Calculate(double x,double y,char op)
{
double result=0;
if(op=='+')
{
result=x+y;
}
else if(op=='-')
{
result=x-y;
}
else if(op=='*')
result=x*y;
else
result=x/y;
return result;
}
int main()
{
string str;
while(getline(cin,str))
{
if(str=="0")break;
int index=0;
stack<double> data;
stack<char> oper;
str+='$';
oper.push('#');
while(index<str.size())
{
if(str[index]==' ')index++;
else if(isdigit(str[index]))
data.push(GetNumber(str,index));
else if(Prior(oper.top())<Prior(str[index]))//不能写成<= 因为优先级相同时,从左往右运算
{
oper.push(str[index]);
index++;
}
else {
double y=data.top();
data.pop();
double x=data.top();
data.pop();
data.push(Calculate(x,y,oper.top()));
oper.pop();
}
}
printf("%.2f\n",data.top());
}
return 0;
}