#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define Max_Stack_Size 1000
const char IsFirst[7][7] = {
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'<', '<', '<', '<', '<', '=', '='},
{'>', '>', '>', '>', '>', '>', '>'},
{'<', '<', '<', '<', '<', '<', '='}
} ;
struct StackT1{
char Stack[Max_Stack_Size];
int Top;
void ClearStack(){ Top = 1; }
char GetTop(){ return Stack[Top - 1]; }
void Push(char c){ Stack[Top++] = c; }
void Pop(char &c){ c = Stack[--Top]; }
} OPTR; // 运算符栈
struct StackT2{
int Stack[Max_Stack_Size];
int Top;
void ClearStack(){ Top = 1; }
int GetTop(){ return Stack[Top - 1]; }
void Push(int c){ Stack[Top++] = c; }
void Pop(int &c){ c = Stack[--Top]; }
} OPND; //操作数栈
bool IsNum(char c){
//cout << c << endl;
return (c >= '0' && c <= '9');
}
int Operate(int a, char OP, int b){
int c;
//cout << a << OP << b << endl;
switch (OP) {
case '+': c = a + b; break;
case '-': c = a - b; break;
case '*': c = a * b; break;
case '/': c = a / b; break;
}
return c;
}
int Change(char c){
int ret;
switch (c) {
case '+': ret = 0; break;
case '-': ret = 1; break;
case '*': ret = 2; break;
case '/': ret = 3; break;
case '(': ret = 4; break;
case ')': ret = 5; break;
case '#': ret = 6; break;
}
return ret;
}
char Precede(char a, char b){
//cout << IsFirst[Change(a)][Change(b)] << endl;
return IsFirst[Change(a)][Change(b)];
}
void EvaluateExpression(void){
OPTR.ClearStack(), OPND.ClearStack();
OPTR.Push('#');
char ChNow = getchar();
while(ChNow != '#' || OPTR.GetTop() != '#'){
if (IsNum(ChNow)) {
int NowNum = ChNow - '0';
ChNow = getchar();
while (IsNum(ChNow)){
NowNum = ChNow - '0' + NowNum * 10;
ChNow = getchar();
}
OPND.Push(NowNum);
/*
for (int i = 0; i < OPND.Top; i++)
cout << OPND.Stack[i] << " ";
cout << endl; */
}
else {
//cout << ChNow << endl;
switch (Precede(OPTR.GetTop(), ChNow)){
case '<':
OPTR.Push(ChNow); ChNow = getchar();
break;
case '=':
char x; OPTR.Pop(x); ChNow = getchar();
break;
case '>':
char theta; OPTR.Pop(theta);
int a, b; OPND.Pop(b); OPND.Pop(a);
OPND.Push(Operate(a, theta, b));
break;
}
}
}
cout << OPND.GetTop() << endl;
}
int main(){
EvaluateExpression();
return 0;
}