#include <cstdio> #include <iostream> #include <list> #include <queue> #include <cstring> #include <stack> #include <algorithm> using namespace std; double calc(double a,char op,double b){ if(op == '+') return a + b; if(op == '-') return a - b; if(op == '*') return a * b; if(op == '/') return a / b; } int main(int argc, char const *argv[]) { char s[100]; double x,y; int priv[300]; priv['+'] = priv['-'] = 2; priv['*'] = priv['/'] = 1; priv['('] = 10; while(scanf("%s",s) != EOF){ stack<double> num; stack<char> oper; int len = strlen(s); char last = 0; for(int i = 0;i < len;i++){ if(isdigit(s[i])){ num.push(atof(s + i)); for(;i + 1 < len && (isdigit(s[i + 1]) || s[i + 1] == '.');i++); }else if(s[i] == '('){ oper.push(s[i]); }else if(s[i] == ')'){ while(oper.top() != '('){ x = num.top(); num.pop(); y = num.top(); num.pop(); char op = oper.top(); num.push(calc(x,op,y)); } oper.pop(); }else if(s[i] == '-' && (last == 0 || last == '(')){ num.push(0.0); oper.push('-'); }else if(priv[s[i]] > 0){ while(oper.size() > 0 && priv[s[i]] >= priv[oper.top()]){ y = num.top(); num.pop(); x = num.top(); num.pop(); char op = oper.top(); oper.pop(); num.push(calc(x,op,y)); } oper.push(s[i]); }else continue; last = s[i]; } while(oper.size() > 0){ y = num.top(); num.pop(); x = num.top(); num.pop(); char op = oper.top(); oper.pop(); num.push(calc(x,op,y)); } cout << num.top() << endl; } return 0; }