#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef char SElemType;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S)
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
char GetTop(SqStack S,SElemType &e)
{
if(S.top==S.base)return ERROR;
else e=*(S.top-1);
return e;
}
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e)
{
if(S.base==S.top)return ERROR;
else e=*--S.top;
return OK;
}
int StackLength(SqStack S)
{
return S.top-S.base;
}
int isint(char c)
{
if('0'<=c&&c<='9')return 1;
else return 0;
}
char Precede(char t,char c)
{
switch(t)
{
case '+':
case '-':if(c=='*'||c=='/'||c=='()')return '<';else return '>';
case '^':
case '*':
case '/':if(c=='()')return '<';else return '>';
case '(':if(c==')')return '=';else return '<';
case ')':return '>';
case '=':if(c=='=')return ';';else return '<';
}
}
int Mi(int a,int b)
{
int i,a0;
a0=a;
for(i=1;i<b;i++)
{
a*=a0;
}
return a;
}
int Operate(int a,char theta,int b)
{
switch(theta)
{
case '+':return a+b+'0';
case '-':return a-b+'0';
case '*':return a*b+'0';
case '/':return a/b+'0';
case '^':return Mi(a,b)+'0';
}
}
int main()
{
SqStack RAND,TOR;
char c,e,x,a,b,theta;
InitStack(RAND);
InitStack(TOR);
Push(TOR,'=');
c=getchar();
while(c!='='||GetTop(TOR,x)!='=')
{
GetTop(TOR,e);
if(isint(c))
{
Push(RAND,c);
c=getchar();
}
else
{
switch(Precede(e,c))
{
case ';':Pop(TOR,x);break;
case '<':Push(TOR,c);c=getchar();break;
case '=':Pop(TOR,x);c=getchar();break;
case '>':Pop(TOR,theta);Pop(RAND,b);Pop(RAND,a);Push(RAND,Operate(a-'0',theta,b-'0'));break;
}
}
}
while(StackLength(RAND)>1)
{
Pop(TOR,theta);Pop(RAND,b);Pop(RAND,a);Push(RAND,Operate(a-'0',theta,b-'0'));
}
Pop(RAND,e);
printf("%d",e-'0');
return 0;
}