#include <fstream>
#include <iostream>
using namespace std;
ifstream in ("evaluare.in");
ofstream out ("evaluare.out");
int const nmax = 100000;
char line[nmax];
struct Symbol {
char op; //'@'
int priority;
long number;
};
Symbol infix[nmax], postfix[nmax];
int infixp = 0, postfixp = 0;
void pushto(Symbol s, Symbol *exp, int &pointer) {
exp[pointer] = {s.op, s.priority, s.number};
pointer++;
}
void chartoinfix(char *vec){
int i = 0 , nr = 0;
bool startno = 0;
while(vec[i]!= '\0') {
if('0' <= vec[i] && vec[i] <= '9'){
nr = nr * 10 + vec[i]-'0';
startno = 1;
} else{
if (startno == 1){
pushto({'@', 0, nr}, infix, infixp);
startno = 0;
}
nr = 0;
if(vec[i] == '(' || vec[i] == ')'){
pushto({vec[i], 0, 0}, infix, infixp);
} else if(vec[i] == '+' || vec[i] == '-'){
pushto({vec[i], 2, 0}, infix, infixp);
} else {
pushto({vec[i], 3, 0}, infix, infixp);
}
}
i++;
}
if (startno == 1){
pushto({'@', 0, nr}, infix, infixp);
startno = 0;
nr = 0;
}
}
void infixtopostfix(Symbol *vec, int &vecp, Symbol *rez, int &rezp){
Symbol stack[nmax];
int pointer = 0;
for(int i=0; i<vecp; i++) {
if(vec[i].op == '@')
pushto(vec[i], rez, rezp);
else{
if(vec[i].op == '('){
pushto(vec[i] , stack , pointer);
}
else if(vec[i].op == ')') {
while(stack[pointer-1].op != '(') {
pushto(stack[pointer-1] ,rez ,rezp);
pointer--;
}
pointer--;
}else if(stack[pointer - 1].op == '(' ||
stack[pointer - 1].priority < vec[i].priority) {
pushto(vec[i] , stack , pointer);
} else{
while(vec[i].priority <= stack[pointer - 1].priority){
pushto(stack[pointer-1], rez, rezp);
pointer--;
}
pushto(vec[i], stack, pointer);
}
}
}
while(pointer>0){
pushto(stack[pointer-1], rez, rezp);
pointer--;
}
}
long evalpostfix(Symbol *vec, int vecp) {
long stack[nmax];
int pointer = 0;
for(int i = 0; i < vecp; i++){
if(vec[i].op == '@'){
stack[pointer] = vec[i].number;
pointer++;
} else{
if(vec[i].op == '+')
stack[pointer - 2] = stack[pointer - 2] + stack[pointer - 1];
else if(vec[i].op == '-')
stack[pointer - 2] = stack[pointer - 2] - stack[pointer - 1];
else if(vec[i].op == '*')
stack[pointer - 2] = stack[pointer - 2] * stack[pointer - 1];
else if(vec[i].op == '/')
stack[pointer - 2] = stack[pointer - 2] / stack[pointer - 1];
pointer--;
}
}
return stack[0];
}
int main(){
in>>line;
chartoinfix(line);
infixtopostfix(infix, infixp, postfix, postfixp);
out<<evalpostfix(postfix, postfixp);
}