#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned char prior[7][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}
};
char opset[7]={'+','-','*','/','(',')','#'};
int is_op(char c);
char precede(char a,char b);
int getIndex(char c);
int operate(int a,char op,int b);
int main()
{
char expression[256];
int evaluate=0;
while(scanf("%s",expression)==1)
{
evaluate=evaluateExpression(expression);
printf("%d\n",evaluate);
}
return 0;
}
int evaluateExpression(char *expression)
{
char optr[256];
int opnd[256];
int top1,top2;
char tempData[20];
int data,a,b;
char *c,dr[2];
int x,i;
char op;
top1=top2=-1;
optr[++top1]='#';
c=expression;
strcpy(tempData,"\0");
while(*c!='#'||optr[top1]!='#')
{
if(!is_op(*c))
{
dr[0]=*c;
dr[1]='\0';
strcat(tempData,dr);
c++;
if(is_op(*c))
{
data=atoi(tempData);
opnd[++top2]=data;
strcpy(tempData,"\0");
}
}
else
{
switch(precede(optr[top1],*c))
{
case '<':
optr[++top1]=*c;
c++;
break;
case '=':
top1--;
c++;
case '>':
op=optr[top1--];
b=opnd[top2--];
a=opnd[top2--];
opnd[++top2]=operate(a,op,b);
break;
}
}
}
return opnd[top2];
}
int is_op(char c)
{
int i;
for(i=0;i<7;i++)
if(c==opset[i])
return 1;
return 0;
}
char precede(char a,char b)
{
int i,j;
i=getIndex(a);
j=getIndex(b);
return prior[i][j];
}
int getIndex(char c)
{
int i;
for(i=0;i<7;i++)
if(c==opset[i])
return i;
}
int operate(int a,char op,int b)
{
int value;
switch(op)
{
case '+':
value=a+b;
break;
case '-':
value=a-b;
break;
case '*':
value=a*b;
break;
case '/':
value=a/b;
break;
}
return value;
}
/**************************************************************
Problem: 2145
User: admin
Language: C
Result: Accepted
Time:10 ms
Memory:1144 kb
****************************************************************/