//stack <char> oper 操作符
//stack <double> num 中间数字
//从左向右遍历表达式 1.数字、num压栈 2.运算符 a.高优先级 oper压栈 b.低优先级/相等 先oper弹出一个、再num弹出两个进行运算压回num,
//再把新的运算符压栈
#include <iostream>
#include<cstdio>
#include<map>
#include<stack>
#include<string>
using namespace std;
map<char, int> priority = {
{'$', 0},
{'+', 1}, {'-', 1},
{'*', 2}, {'/', 2}
};
int main() {
string str;
while (getline(cin, str)) {
if (str == "0") {
break;
}
str.push_back('$');//补充一个终止符
stack<char>oper;
stack<double>numb;
string num;
for (int i = 0; i < str.size(); ++i) {
if (str[i] >= '0' &&
str[i] <= '9') { //用来搜索单独的0-9以组成一个数
num.push_back(str[i]);
if (str[i] != str.size() - 1 && !(str[i + 1] >= '0' && str[i + 1] <= '9')) {
numb.push(stod(num));
num = " ";
}
}
//前面都在处理数
else {
while (!oper.empty() &&
priority[oper.top()] >=
priority[str[i]]) //说明比str[i]优先级更高的运算符都计算过了
//新来的运算符的优先级不高于栈顶的优先级
{
char op = oper.top(); //弹出原来的运算符
oper.pop();
double rhs = numb.top();
numb.pop();
double lhs = numb.top();
numb.pop();//弹出左右两个操作数
switch (op) {
case'+':
numb.push(lhs + rhs);
break;
case'-':
numb.push(lhs - rhs);
break;
case'*':
numb.push(lhs * rhs);
break;
case'/':
numb.push(lhs / rhs);
break;
}
}
oper.push(str[i]);
}
}
cout<<numb.top()<<endl;
}
}