#include <iostream>
#include <algorithm>
#include <stack>
#include <string>
#include <cstdio>
#include <map>
using namespace std;
//KY129
int main() {
char buf[400];
//用map来存储运算符的优先级
map<char, int> priority = {
{'$', 0},
{'+', 1},
{'-', 1},
{'*', 2},
{'/', 2}
};
while (fgets(buf, 400, stdin) != NULL) {
string expr = buf; //转换成C++风格的字符串,expression
expr.pop_back(); //弹出最后的换行符
if (expr == "0") {
break;
}
expr.push_back('$'); //加上结尾
string num; //用来收集单独的数字 1 3 -> 13
stack<double> numStack;
stack<char> operStack;
for (int i = 0; i < expr.size(); i++) {
if (expr[i] >= '0' &&
expr[i] <= '9') { //如果是数字,则追加到num后面
num.push_back(expr[i]);
} else if (expr[i] == ' ') { //直到读取到空格
if (num != "") { //如果num有值,则放到操作数里
numStack.push(stod(num)); //stod(string s) 把s转换成double类型
num = "";
}
} else {
if (expr[i] == '$') {
if (num != "") {
numStack.push(stod(num)); //stod(string s) 把s转换成double类型
num = "";
}
}
while (!operStack.empty() && priority[operStack.top()] >= priority[expr[i]]) {
double num1 = numStack.top();
numStack.pop();
double num2 = numStack.top();
numStack.pop();
char top = operStack.top();
operStack.pop();
switch (top) {
case '+':
numStack.push(num2 + num1);
break;
case '-':
numStack.push(num2 - num1);
break;
case '*':
numStack.push(num2 * num1);
break;
case '/':
numStack.push(num2 / num1);
break;
}
}
operStack.push(expr[i]);
}
}
//输出最后的字符
printf("%.2lf\n", numStack.top());
numStack.pop();
}
}