#include <bits/stdc++.h>
using namespace std;
//从0开始
//另一种方法构建表达式树,并通过表达式树进行表达式求值
//约定表达式都是合法的,且在一行内输入,并没有空格
//约定运算符有 + - * /(整除) ( )
//约定操作数都是一位正整数,没有负号
char s[100],ops[100];//ops是树的节点内容
int len=-1,lc[100],rc[100];
//对应节点的左右子树,不想用结构体,伪指针
//思路:运算符优先级最低的点是根
//数值点一定是叶子,单独创建
//最后一个允许的运算符:跳过所有的括号内的运算符,找括号外的 最后一个+-*/,
//如果有-+,就以+-为准,否则以*/为准
int build(int x,int y){
// [x,y)
int c1=-1,c2=-1,p=0;
if(y-x==1){
//只有一个字符,肯定是数字
len++;
ops[len]=s[x];
rc[len]=lc[len]=-1;
return len;
}
for(int i=x;i<y;i++){
switch (s[i])
{
case '(':p++;break;
case ')':p--;break;
//相当于 或
case '+':case '-':if(!p) c1=i;break;
case '*':case '/':if(!p) c2=i;break;
}
}
//整体被括号包住了
//注意在此处停止
if(c1==-1&&c2==-1) return build(x+1,y-1);
else if(c1==-1) c1=c2;
//以+-为准
int t=++len;//重要,否则递归后len就变了,会赋值错误
ops[t]=s[c1];
lc[t]=build(x,c1);//注意左闭右开区间
rc[t]=build(c1+1,y);
return t;
}
void zhongxu(int x){
//因为叶子的左右子树都是0
if(x==-1) return;
zhongxu(lc[x]);
cout<<ops[x];
zhongxu(rc[x]);
}
int cal(int x){
if(rc[x]==-1&&lc[x]==-1) return ops[x]-'0';
int a,b;
a=cal(lc[x]);
b=cal(rc[x]);
switch (ops[x])
{
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
}
}
int main()
{
cin>>s;
build(0,strlen(s));
cout<<cal(0)<<endl;
return 0;
}