#include<iostream>
#include<string>
#include<stack>
#include<QUEUE>
using namespace std;
class Data
{
public:
char Op;
double Number;
};
void getEnter( char Enter[100] )
{
cin.getline(Enter,100);
}
int judgeOp( char Op )
{
switch(Op)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
return 1;
}
if(Op>='0'&&Op<='9')
return 0;
if (Op=='.')
{
return 0;
}
return 2;
}
int OpChange(char Op)
{
switch(Op)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
}
}
int OperatorCompare( char Op1, char Op2 )
{
if(Op1=='(')
return 1;
if(Op2=='(')
return 1;
return OpChange(Op1)>OpChange(Op2)?1:0;
}
void toLastModel( char Enter[100],queue<Data> &Process )
{
int i = 0;
stack<char> SOper;
string GetNum = "\0";
while( Enter[i] != '\0' )
{
if(judgeOp(Enter[i])==1)
{
if(GetNum!="\0")
{ Data Temp;
Temp.Op = '@';
Temp.Number = atof(GetNum.c_str());
Process.push(Temp);
GetNum = "\0";}
//如果是字符,则需要和栈顶进行比较优先级
if(!SOper.empty())
{
if(Enter[i]==')')
{
while(SOper.top()!='(')
{
Data t;
t.Op = SOper.top();
Process.push(t);
SOper.pop();
}
SOper.pop();
}else
if(OperatorCompare(Enter[i],SOper.top()))
{
//当前运算符优先级高于栈顶优先级,运算符进栈
SOper.push(Enter[i]);
}
else
{
//当前运算符的优先级低于栈顶优先级
Data TempData;
TempData.Op = SOper.top();
Process.push(TempData);
SOper.pop();
SOper.push(Enter[i]);
}
}else
{
SOper.push(Enter[i]);
}
}
else if(judgeOp(Enter[i])==0)
{
//如果是数字,则对数字进行累积处理
GetNum += Enter[i];
}
i++;
}
if(GetNum!="\0")
{
Data Temp;
Temp.Op = '@';
Temp.Number = atof(GetNum.c_str());
Process.push(Temp);
GetNum = "\0";
}
while(!SOper.empty())
{
Data Temp;
Temp.Op = SOper.top();
SOper.pop();
Process.push(Temp);
}
}
double calTwo( double a, double b, char c)
{
switch(c)
{
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
return a/b;
}
}
double calculateNumber(queue<Data> Cal)
{
double Result = 0;
stack<double> SNumber;
while(!Cal.empty())
{
if(Cal.front().Op=='@')
{
double temp = 0;
temp = Cal.front().Number;
SNumber.push(temp);
Cal.pop();
}
else
{
double number1 = 0, number2 = 0;
number2 = SNumber.top();
SNumber.pop();
number1 = SNumber.top();
SNumber.pop();
Result = calTwo(number1,number2,Cal.front().Op);
SNumber.push(Result);
Cal.pop();
}
}
return Result;
}
void main()
{
char Enter[100];
queue<Data> Process;
getEnter(Enter);
toLastModel(Enter,Process );
cout << calculateNumber(Process);
cout << endl;
}