#include<iostream>
#include<stack>
#include<string>
using namespace std;
/*
*判断操作数的优先级
*/
int priority(int state,char a)
{
int result;
switch (a){
case '+':
case '-':
result = 1;
break;
case '*':
case '/':
result = 2;
break;
case '(':
if (state == 0)
result = 3;
else
result = 0;
break;
case '#':
result = 0;
break;
default:
break;
}
return result;
}
/*
*计算
*/
double calculate(char op, double op1, double op2)
{
double result;
switch (op){
case '+':
result = op1 + op2;
break;
case '-':
result = op1 - op2;
break;
case '*':
result = op1*op2;
break;
case '/':
result = op1 / op2;
break;
default:
break;
}
return result;
}
int main()
{
string s;
while (cin >> s){ //多次测试
stack<char> operation; //存储操作符的栈
stack<double> operand; //存储操作数的栈(浮点类型)
operation.push('#');
string num;
for (int i = 0; i < s.length(); i++){
/*
*将读取到的string类型的操作数转换为double类型并存入操作数栈
*/
if (isdigit(s[i])){
while (isdigit(s[i]) || s[i] == '.'){
num.push_back(s[i]);
i++;
}
double a = atof(num.c_str());//string->double
operand.push(a);
num.clear();
i--;
}
/*
*将优先级高的先计算出值,保存
*/
else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '('){
if (priority(0, s[i])>priority(1, operation.top()))
operation.push(s[i]);
else{
while (priority(0, s[i]) <= priority(1, operation.top())){
char temp = operation.top();
operation.pop();
double op2 = operand.top();
operand.pop();
double op1 = operand.top();
operand.pop();
operand.push(calculate(temp, op1, op2));
}
operation.push(s[i]);
}
}
else if (s[i] == ')'){
while (operation.top() != '('){
char temp = operation.top();
operation.pop();
double op2 = operand.top();
operand.pop();
double op1 = operand.top();
operand.pop();
operand.push(calculate(temp, op1, op2));
}
operation.pop();
}
else{
cout << "error!" << endl;
return 0;
}
}
//完成剩余的计算,此时已经没有括号(在上面已经计算完成)
while (operation.top() != '#'){
char temp = operation.top();
operation.pop();
double op2 = operand.top();
operand.pop();
double op1 = operand.top();
operand.pop();
operand.push(calculate(temp, op1, op2));
}
cout << operand.top() << endl;
}
return 0;
}