#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());
}