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

char c[2000005];
stack<char> op;
queue<char> s;

stack<LL> T;
LL JS(queue<char> s, stack<LL> T) {

    while(!s.empty()) {

        //将队列中的数据依次出队,然后压栈
        if(s.front()>='0'&&s.front()<='9') {
            LL t=0;
            while(!s.empty()&&s.front()>='0'&&s.front()<='9') {
                t=t*10+s.front()-'0';
                s.pop();
            }
            s.pop();//数字结束。pop空格
            T.push(t);
        } else {
            //在出队的过程中如果遇到运算符,则从栈中弹出2个运算数,分别作为右运算数和左运算数,进行运算;
            //步骤2的运算结果入栈;
            LL ans1=T.top();
            T.pop();
            LL ans2=T.top();
            T.pop();
            if(s.front()=='*') {
                T.push(ans2*ans1);
            }
            if(s.front()=='/') {
                T.push(ans2/ans1);
            }
            if(s.front()=='+') {
                T.push(ans2+ans1);
            }
            if(s.front()=='-') {
                T.push(ans2-ans1);
            }
            s.pop();
        }
    }
    LL ans=T.top();
    T.pop();
    return ans;
}

int main() {

    scanf("%s", c+1);
    LL n=strlen(c+1);
    for(LL i=1; i<=n; i++) {
        if(c[i]==' ') { //空格
            continue;
        }

        //若读取的是操作数 将该操作数存入操作数堆栈
        if('0'<=c[i]&&c[i]<='9') {
            while('0'<=c[i]&&c[i]<='9') {
                s.push(c[i]);
                i++;
            }
            s.push(' ');//多加空格表示一个数字结束
            i--;
        } else {
            //该运算符为左括号"(",则直接存入运算符堆栈。
            if(c[i]=='(') {
                op.push(c[i]);
                continue;
            }
            //该运算符为右括号")",则输出运算符堆栈中的运算符到操作数堆栈,直到遇到左括号为止。
            if(c[i]==')') {
                while(!op.empty()&&op.top()!='(') {
                    s.push(op.top());
                    op.pop();
                }
                op.pop();
                continue;
            }
            //若运算符堆栈栈顶的运算符为括号,则直接存入运算符堆栈。
            if(op.empty()||op.top()=='(') {
                op.push(c[i]);
                continue;
            }
            //若比运算符堆栈栈顶的运算符优先级高,则直接存入运算符堆栈
            if(op.empty()||((c[i]=='*'||c[i]=='/')&&(op.top()=='+'||op.top()=='-'))) {
                op.push(c[i]);
                continue;
            }
            //若比运算符堆栈栈顶的运算符优先级低或者相等,
            //则输出栈顶运算符到操作数堆栈,并将当前运算符压入运算符堆栈。
            while(!op.empty()&&!((c[i]=='*'||c[i]=='/')&&(op.top()=='+'||op.top()=='-'))&&op.top()!='(') {
                s.push(op.top());
                op.pop();
            }
            op.push(c[i]);
        }
    }
    //当表达式读取完成后运算符堆栈中尚有运算符时,
    //则依序取出运算符到操作数堆栈,直到运算符堆栈为空。
    while(!op.empty()) {
        s.push(op.top());
        op.pop();
    }

//        while(!s.empty()){
//            cout<<s.front();
//            s.pop();
//        }
//        cout<<endl;

    printf("%lld\n", JS(s, T));

    return 0;
}