#include <iostream>
#include <stack>
#include <cctype>
using namespace std;
int _priority(char c) {
if (c == '+' || c == '-') return 1;
else return 2;
}
bool _isOp(char c) {
if (c == '+' || c == '-' || c == '*' || c == '/') return true;
return false;
}
float _calculate(float a, float b, char op) {
if (op == '+') return a + b;
else if (op == '-') return a - b;
else if (op == '*') return a * b;
else return a / b;
}
int main() {
string str;
while (getline(cin, str)) {
if (str == "0") break;
stack<float> nums;
stack<char> ops;
for (int i = 0; i < str.size(); i++) {
if (str[i] == ' ') continue;
else if (isdigit(str[i])) {
// 处理数字/多位数
float temp = 0;
// ***********************************************i++会越界访问数组!!!!
//while (isdigit(str[i])) {
while (i<str.size() && isdigit(str[i])) {//*******************先越界检查再判断,次序别反了!!!
temp = temp * 10 + ( str[i] - '0' );
i++;
} // 结束的时候i不是数字,走过了,需要退回
i--;
// 数字直接入栈就可以,只有操作符入栈才涉及运算
nums.push(temp);
}
else if(_isOp(str[i])) {
// 处理运算符
// 高入低弹 (<=都弹,弹完入)
//************************************************if (ops.empty()) ops.push(str[i]);
if (ops.empty()) {
ops.push(str[i]);
continue;
}
// ops非空
if (_priority(str[i]) > _priority(ops.top())) ops.push(str[i]);
else {
// <=
//******************************************************先越界检查再判断,次序别反了!!!
while (!ops.empty() && _priority(str[i]) <= _priority(ops.top())) {
// 运算 注意操作数次序关系,运算后入操作数栈
float temp_res, a, b;
char op;
b = nums.top();
nums.pop();
a = nums.top();
nums.pop();
op = ops.top();
ops.pop();
temp_res = _calculate(a, b, op);
nums.push(temp_res);
}
// 运算后 入
ops.push(str[i]);
}
}
} // 遍历一遍str结束 最后ops内优先级要么相同要么从低到高,顺序计算即可
while (!ops.empty()) {
float temp_res, a, b;
char op;
b = nums.top();
nums.pop();
a = nums.top();
nums.pop();
op = ops.top();
ops.pop();
temp_res = _calculate(a, b, op);
nums.push(temp_res);
} // 运算后nums仅剩一个结果值
printf("%.2f\n", nums.top());
}
}
// 64 位输出请用 printf("%lld")