#include<malloc.h> 
#include<stdio.h> 
#include<process.h> 
#define OK 1 
#define ERROR 0 
#define STACK_INIT_SIZE 100 
#define STACKINCREMENT 10 
 
//typedef char SElemType;// 
//typedef char Status;// 
 
struct SqStack{ 
    int *base; 
    int *top; 
    int stacksize; 
}; 
 
 
int InitStack(SqStack &S){ 
    S.base = (int *)malloc(STACK_INIT_SIZE*sizeof(int)); 
    if(!S.base) return ERROR; 
    S.top = S.base; 
    S.stacksize = STACK_INIT_SIZE; 
    return OK; 
} 
 
 
int Push(SqStack &S,char e){ 
    if(S.top-S.base>=S.stacksize){ 
        S.base = (int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int)); 
        if(!S.base)exit(0); 
        S.top = S.base + S.stacksize; 
        S.stacksize += STACKINCREMENT; 
    } 
    *S.top++ = e; 
    return OK; 
} 
 
 
int Pop(SqStack &S,char &e){ 
    if(S.top == S.base) return ERROR; 
     e=*--S.top; 
     return OK; 
} 
 
int GetTop(SqStack S){ 
    char e; 
    if(S.top == S.base) return ERROR; 
    e = *--S.top; 
    return e; 
} 
 
int Transfor(char c) 
{
    //返回字符c对应优先关系表中的行列号 
  int k; 
  switch(c) 
     {
   
 case '+':k=0;break; 
 case '-':k=1;break; 
 case '*':k=2;break; 
 case '/':k=3;break; 
 case '(':k=4;break; 
 case ')':k=5;break; 
 case '#':k=6;break; 
     } 
  return k; 
} 
 
 
char JudgePrecede(char c1,char c2){ 
    //优先级判断 
 
int i,j; 
char pre[7][7]={{'>','>','<','<','<','>','>'}, 
                {'>','>','<','<','<','>','>'}, 
                {'>','>','>','>','<','>','>'}, 
                {'>','>','>','>','<','>','>'}, 
                {'<','<','<','<','<','=',' '}, 
                {'>','>','>','>',' ','>','>'}, 
                {'<','<','<','<','<',' ','='} 
            }; 
 
        i=Transfor(c1); 
        j=Transfor(c2); 
        return(pre[i][j]); 
} 
 
 
int IfOperator(char c){ 
    //判断c是否为运算符 
    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#') 
    { 
        return(1); 
    } 
    else 
    { 
        return(0); 
    } 
} 
 
char Operate(char a,char theta,char b) 
{ 
char c; 
a=a-48; 
b=b-48; 
switch(theta) 
{ 
case'+':c=a+b+48;break; 
case'-':c=a-b+48;break; 
case'*':c=a*b+48;break; 
case'/':c=a/b+48;break; 
 
} 
return c; 
} 
 
 
char EvaluateExpression(){ 
    SqStack OPTR,OPND; 
    char a,b,c,x,theta; 
    InitStack(OPTR);
  
    Push(OPTR,'#'); 
    InitStack(OPND);
  
    c=getchar(); 
    while(c!='#'||GetTop(OPTR)!='#'){ 
        if(!IfOperator(c)) 
        { 
            Push(OPND,c); 
            c=getchar(); 
        } 
        else 
            switch(JudgePrecede(GetTop(OPTR),c)) 
        { 
            case '<':Push(OPTR,c);c=getchar();break; 
            case '=':Pop(OPTR,x);c=getchar();break; 
            case '>':Pop(OPTR,theta); 
                     Pop(OPND,b); 
                       Pop(OPND,a); 
                     Push(OPND,Operate(a,theta,b));break; 
        } 
    } 
    return GetTop(OPND); 
} 
 
void main() 
{ 
printf("请输入算术表达式(中间值及最终结果要在0~9之间),并以#结束\n"); 
printf("%c\n",EvaluateExpression()); 
}