#include <iostream>
using namespace std;
const int otbl[7][7] =
{{-2, -2, 2, 2, 2, -1, 0},//i+
{-2, -2, 2, 2, 2, -1, 0}, //-
{-2, -2, -2, -2, 2, -1, 0}, //*
{-2, -2, -2, -2, 2, -1, 0}, ///
{ 2, 2, 2, 2, 2, -1, 0}, //(
{-1, -1, -1, -1, -1, -1, 0}, //)
{ 2, 2, 2, 2, 2, 2, -3}};//@
//o+ - * / ( ) @
struct stack
{
char n[1001];
int top;
stack()
{
memset(n, 0, sizeof n);
top = 0;
}
void push(char x)
{
n[++top] = x;
}
char pop()
{
if(top > 0)
return n[top--];
return '!';
}
bool empty()
{
if(top > 0)
return false;
return true;
}
}oprt;
struct stack1
{
int n[1001];
int top;
stack1()
{
memset(n, 0, sizeof n);
top = 0;
}
void push(int x)
{
n[++top] = x;
}
int pop()
{
if(top > 0)
return n[top--];
return '!';
}
bool empty()
{
if(top > 0)
return false;
return true;
}
}opnd;
bool isdigit(char x)
{
if(x != '@' && x != '+' && x != '-' && x != '*'
&&x != '/' && x != '(' && x != ')')
return true;
return false;
}
int ocmp(char opa, char opb)
{
int opax = 0;
switch(opa)
{
case '+': opax = 0; break;
case '-': opax = 1; break;
case '*': opax = 2; break;
case '/': opax = 3; break;
case '(': opax = 4; break;
case ')': opax = 5; break;
case '@': opax = 6; break;
}
int opbx = 0;
switch(opb)
{
case '+': opbx = 0; break;
case '-': opbx = 1; break;
case '*': opbx = 2; break;
case '/': opbx = 3; break;
case '(': opbx = 4; break;
case ')': opbx = 5; break;
case '@': opbx = 6; break;
}
return otbl[opbx][opax];
}
string tostring(int x)
{
string str = "";
int n[101], y = x;
memset(n, 0, sizeof n);
for(int i = 1; y > 0; y /= 10)
{
n[i++] = y % 10;
n[0]++;
}
for(int i = n[0]; i > 0; i--)
str += char(n[i] + '0');
return str;
}
int calc(string s, int* r)
{
int x = 0;
for(int i = 0; s[i] != '@'; i++)
{
if(s[i] != ',')
x = x * 10 + s[i] - '0';
if(s[i] == ',')
if(x != 0)
{
opnd.push(x);
x = 0;
}
switch(s[i])
{
case '+':
x = opnd.pop();
opnd.n[opnd.top] += x;
x = 0;break;
case '-':
x = opnd.pop();
opnd.n[opnd.top] -= x;
x = 0;break;
case '*':
x = opnd.pop();
opnd.n[opnd.top] *= x;
x = 0;break;
case '/':
x = opnd.pop();
opnd.n[opnd.top] /= x;
x = 0;break;
}
}
*r = opnd.n[opnd.top];
return *r;
}
int main()
{
string s, r = "";
cin >> s;
s += '@';
int lng = s.length();
oprt.push('@');
int x = 0;
for(int i = 0; i <= lng; i++)
{
if(isdigit(s[i]) && isdigit(s[i+1]))
{
x = x *10 + s[i] - '0';
continue;
}
else if(isdigit(s[i]) && !isdigit(s[i+1]))
{
x = x * 10 + s[i] - '0';
r += tostring(x) + ',';
x = 0;
continue;
}
else if(!isdigit(s[i]))
{
int flg = ocmp(s[i], oprt.n[oprt.top]);
switch(flg)
{
case 2: oprt.push(s[i]);
break;
case -2: r += oprt.pop();
oprt.push(s[i]);
break;
case -1: while(oprt.n[oprt.top] != '(')
r += oprt.pop();
oprt.pop();
break;
case 0: while(oprt.n[oprt.top] != '@')
r += oprt.pop();
break;
case -3: x = 99999; break;
}
if(x == 99999)
break;
}
}
cout << calc(r + '@', &x) << endl;
return 0;
}