#include <stdio.h>
#include <stdlib.h>
#define INITSIZE 100
#define INCREAMENT 10
typedef struct{
char * data;
char * top;
int stacksize;
}OPTRStack;
typedef struct{
int * data;
int * top;
int stacksize;
}OPNDStack;
void InitOPTRStack(OPTRStack * S){
S -> data = (char *)malloc(INITSIZE * sizeof(char));
if(! S -> data) exit(0);
S -> top = S -> data;
S -> stacksize = INITSIZE;
}
void InitOPNDStack(OPNDStack * S){
S -> data = (int *)malloc(INITSIZE * sizeof(int));
if(! S -> data) exit(0);
S -> top = S -> data;
S -> stacksize = INITSIZE;
}
void PushOPTR(OPTRStack * S, char e){
if (S -> top - S -> data >= S -> stacksize){
S -> data = (char *)realloc(S -> data, (INITSIZE + INCREAMENT) * sizeof(char));
if(! S -> data) exit(0);
S -> top = S -> data;
S -> stacksize = INITSIZE + INCREAMENT;
}
* S -> top ++ = e;
}
void PushOPND(OPNDStack * S, int e){
if (S -> top - S -> data >= S -> stacksize){
S -> data = (int *)realloc(S -> data, (INITSIZE + INCREAMENT) * sizeof(int));
if(! S -> data) exit(0);
S -> top = S -> data;
S -> stacksize = INITSIZE + INCREAMENT;
}
* S -> top ++ = e;
}
void PopOPTR(OPTRStack * S, char * e){
if (S -> data == S -> top) exit(0);
* e = * -- S -> top;
}
void PopOPND(OPNDStack * S, int * e){
if (S -> data == S -> top) exit(0);
* e = * -- S -> top;
}
int GetTopOPND(OPNDStack S){
if (S.data == S.top) exit(0);
return * (S.top - 1);
}
char GetTopOPTR(OPTRStack S){
if (S.data == S.top) exit(0);
return * (S.top - 1);
}
bool In(char c, char OP[]){
for(int i = 0; i < 8; i++){
if(c == OP[i])
return true;
}
return false;
}
char Precede(char a, char b){
int p, q;
if(a == '#')
p = 0;
else if(a == '(')
p = 1;
else if(a == '+' || a == '-')
p = 2;
else if(a == '*' || a == '/')
p = 3;
else if(a == ')')
p = 4;
if(b == '#')
q = 0;
else if(b == '(')
q = 4;
else if(b == '+' || b == '-')
q = 2;
else if(b == '*' || b == '/')
q = 3;
else if(b == ')')
q = 1;
if(a == '#' && b == '#' || a == '(' && b == ')')
return '=';
else if(p >= q)
return '>';
else if(p < q)
return '<';
}
int Operate(int a, char e, int b){
if(e == '+')
return a + b;
else if(e == '-')
return a - b;
else if(e == '*')
return a * b;
else if(e == '/')
return a / b;
}
int EvaluateExpression(){
OPTRStack OPTR;
OPNDStack OPND;
InitOPTRStack(&OPTR);
InitOPNDStack(&OPND);
PushOPTR(&OPTR, '#');
char c = getchar();
char e;
int a, b;
char OP[8] = {'+', '-', '*', '/', '(', ')', '#'};
while(c != '#' || GetTopOPTR(OPTR) != '#'){
if(! In(c, OP)){
int temp = 0;
while(! In(c, OP)){
temp = temp * 10 + c - '0';
c = getchar();
}
PushOPND(&OPND, temp);
}
else{
switch(Precede(GetTopOPTR(OPTR), c)){
case '<':
PushOPTR(&OPTR, c);
c = getchar();
break;
case '=':
PopOPTR(&OPTR, &e);
c = getchar();
break;
case '>':
PopOPTR(&OPTR, &e);
PopOPND(&OPND, &b);
PopOPND(&OPND, &a);
PushOPND(&OPND, Operate(a, e, b));
break;
}
}
}
return GetTopOPND(OPND);
}
int main(){
int value = EvaluateExpression();
printf("%d", value);
return 0;
}