图片说明
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明

#include <bits/stdc++.h>
using namespace std;

int symbol_to_num(char c) {
    switch (c) {
    case '+':
        return 1;
    case '-':
        return 2;
    case '*':
        return 3;
    case '/':
        return 4;
    case '^':
        return 5;
    case '!':
        return 6;
    case '(':
        return 7;
    case ')':
        return 0;
    }
}

void push_symbol_to_stack(char c, stack<char> &sc, vector<string> &output) {
    if (sc.empty())
        sc.push(c);
    else {
        if (symbol_to_num(c) > symbol_to_num(sc.top()))
            sc.push(c);
        else if (c == ')') {
            while (sc.top() != '(') {
                string temp(1, sc.top());
                output.push_back(temp);
                sc.pop();
            }
            sc.pop();
        }
        else {
            if (sc.top() == '(')
                sc.push(c);
            else {
                string temp(1, sc.top());
                output.push_back(temp);
                sc.pop();
                push_symbol_to_stack(c, sc, output);
            }
        }
    }
}

vector<string> transfer(string s) {
    vector<string> output;
    stack<char> sc;
    string temp;
    for (int i = 0; i < s.size(); i++) {
        char c = s[i];
        if (isdigit(c) || c == '.') {
            temp += c;
        }
        else {
            if (temp.size())
                output.push_back(temp);
            else if (c == '-' && i > 0 && s[i - 1] != ')') {//deal with negative sign
                temp += c;
                continue;
            }
            temp.clear();
            push_symbol_to_stack(c, sc, output);
        }
    }
    if (temp.size())
        output.push_back(temp);
    temp.clear();
    while (!sc.empty()) {
        temp += sc.top();
        output.push_back(temp);
        temp.clear();
        sc.pop();
    }
    return output;
}

double solution(vector<string> vs) {
    stack<string> NumStack;
    for (auto s : vs) {
        if (s == "+") {
            double b = stod(NumStack.top());
            NumStack.pop();
            double a = stod(NumStack.top());
            NumStack.pop();
            double res = a + b;
            NumStack.push(to_string(res));
        }
        else if (s == "-") {
            double b = stod(NumStack.top());
            NumStack.pop();
            double a = stod(NumStack.top());
            NumStack.pop();
            double res = a - b;
            NumStack.push(to_string(res));
        }
        else if (s == "*") {
            double b = stod(NumStack.top());
            NumStack.pop();
            double a = stod(NumStack.top());
            NumStack.pop();
            double res = a * b;
            NumStack.push(to_string(res));
        }
        else if (s == "/") {
            double b = stod(NumStack.top());
            NumStack.pop();
            double a = stod(NumStack.top());
            NumStack.pop();
            double res = a / b;
            NumStack.push(to_string(res));
        }
        else if (s == "^") {
            double b = stod(NumStack.top());
            NumStack.pop();
            double a = stod(NumStack.top());
            NumStack.pop();
            double res = pow(a, b);
            NumStack.push(to_string(res));
        }
        else {
            NumStack.push(s);
        }
    }
    return stod(NumStack.top());
}

int main() {
    string s;
    while (cin >> s) {
        for (char &c : s) {
            if (c == '[' || c == '{')
                c = '(';
            if (c == ']' || c == '}')
                c = ')';
        }
        vector<string> IPE = transfer(s);
        double res = solution(IPE);
        cout << fixed << setprecision(0) << res << endl;
    }
    return 0;
}

/*
example:
25+9*70-3/(1+2)
3+2*{1+2*[-4/(8-6)+7]}
3*5+8-0*3-6+0+0
3-10+(0+(10+5+3)-10)
*/