#include<iostream>
using namespace std;
#include<string>
#include<stack>
#include<map>
#include<algorithm>
stack<float>num;//存数据
stack<char>op;//存操作符

//取(pop)num中两个数据 与 op中一个操作符做运算 并将结果放入(push)栈顶
void eval(){ 
    //注意a b顺序
    auto b=num.top();num.pop();
    auto a=num.top();num.pop();
    auto c=op.top();op.pop();

    float x;
    if(c=='+') x=a+b;
    else if(c=='-') x=a-b;
    else if(c=='*') x=a*b;
    else x=a/b;
    num.push(x);

}

int main()
{
    //定义优先级
    map<char,int> pre{{'+',1},{'-',1},{'*',2},{'/',2}};

    string a;
    cin>>a;
    //if(a=="0") return 0;
   
        for(int i=0;i<a.size();i++){
            
            //判断是否是数据 并读入栈底 模板
            auto c=a[i];
            if(isdigit(c)){
                float x=0,j=i;
                while(j<a.size()&&isdigit(a[j]))
                    x=x*10+a[j++]-'0';
                    i=j-1;
                    num.push(x);
                
            }
            //else if(a[i]==' ') continue;
            else{//操作符入op 
            //当栈存在 且栈顶元素优先级大于该元素则出栈eval
                while(op.size()&&pre[op.top()]>=pre[c]) 
                    eval();
            //否则入栈该元素
                op.push(c);
            }
        }
        //易漏 当op不为空时,还要继续计算
        while(op.size()) eval();
        printf("%.0f",num.top());

}