算术表达式的求值----《数据结构》

#include<stdio.h>  
    #include<malloc.h>  
    #include<stdlib.h>  
    #include<string.h>  
    #define MAXSIZE 100  
    typedef int Status;  
    typedef char SElemType;  
    typedef struct  
    {  
        SElemType *base;  
        SElemType *top;  
        int stacksize;  
    }SqStack;  
    Status InitStack(SqStack &S)  
    {  
        S.base=(SElemType*)malloc(sizeof(SElemType)*MAXSIZE);  
        if(!S.base)  
        exit(-2);  
        S.top=S.base;  
        S.stacksize=MAXSIZE;  
        return 1;  
    }  
    Status Push(SqStack &S,SElemType e)  
    {  
        if(S.top-S.base==S.stacksize)  
        return 0; 
        *S.top++=e;
        return 1;  
     }   
    Status Pop(SqStack &S,SElemType &e)  
    {  
        if(S.top==S.base)  
        return 0;  
        e=*--S.top;   
        return 1;  
    }  
    SElemType GetTop(SqStack S) 
    {  
        if(S.top!=S.base)
        return *(S.top-1);
    }  
    int In(SElemType e)
    {  
        if(e=='+'||e=='-'||e=='*'||e=='/'||e=='('||e==')'||e=='#')  
            return 1;
        else   
            return 0;   
    }  
    SElemType Precede(SElemType a,SElemType b)
    {  
        SElemType f;  
        if(a=='+'||a=='-')  
        {  
            if(b=='+'||b=='-'||b==')'||b=='#')  
                f='>';  
            else if(b=='*'||b=='/'||b=='(')  
                f='<';  
        }  
        else if(a=='*'||a=='/')  
        {  
            if(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#')  
               f='>';  
            else if(b=='(')  
               f='<';  
        }  
        else if(a=='(')  
        {  
            if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(')  
               f='<';  
            else if(b==')')  
               f='=';  
        }  
        else if(a==')')  
        {  
            if(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#')  
               f='>';  
        }  
        else if(a=='#')  
        {  
            if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(')  
               f='<';  
            else if(b=='#')  
               f='=';  
        }  
        return f;  
    }  
    SElemType Operate(SElemType a,SElemType theta,SElemType b) 
    {  
        SElemType c;  
        a=a-'0';  
        b=b-'0';  
        if(theta=='+')  
          c=a+b+'0';  
        else if(theta=='-')  
          c=a-b+'0';  
        else if(theta=='*')  
          c=a*b+'0';  
        else if(theta=='/')  
          c=a/b+'0';        
        return c;   
    }  
    int EvaluateExpression()  
    {  
        SqStack OPND,OPTR;  
        char ch,a,b,theta,x;  
        InitStack(OPND); 
        InitStack(OPTR);
        Push(OPTR,'#');  
        ch=getchar();  
        while(ch!='#'||GetTop(OPTR)!='#')  
        {  
            if(!In(ch))  
            {  
                Push(OPND,ch);  
                ch=getchar();  
            }  
            else  
            {  
                switch(Precede(GetTop(OPTR),ch))  
                {  
                    case '<':  
                        Push(OPTR,ch);  
                        ch=getchar();  
                        break;  
                    case '>':  
                        Pop(OPTR,theta);  
                        Pop(OPND,b);  
                        Pop(OPND,a);  
                        Push(OPND,Operate(a,theta,b));  
                        break;  
                    case '=':  
                        Pop(OPTR,x);  
                        ch=getchar();  
                        break;  
                }  
            }   
        }  
        return GetTop(OPND)-'0';  
    }  
    int main()  
    {  
        printf("请输入算术表达式,并以#结束\n");  
        printf("结果是: %d\n",EvaluateExpression());  
        return 0;  
    }  

 

posted @ 2017-11-12 19:47  自由的背包  阅读(337)  评论(0编辑  收藏  举报