码迷,mamicode.com
首页 > 其他好文 > 详细

Stack实现表达式的求值

时间:2020-06-24 16:19:37      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:inf   span   后缀   ima   max   lazy   tac   中缀表达式   不同   

1.用栈求中缀表达式的值:

建立2个栈,S1暂存操作数,S2暂存运算符,当遇到操作数则入S1,遇到运算符准备入S2,首先若S2为空或者S2栈顶为‘(‘,则运算符直接入S2栈,若S2不空并且S2栈顶非‘(‘,若当前扫描运算符的运算优先级大于栈顶运算符优先级,则入栈S2,否则对S2不停地执行出栈操作,每出栈一个运算符就同时从S1出栈2个操作数,先出栈的排在右边,后出战的排在左边,然后拿这2个操作数与运算符进行运算并将结果存入S1

int getPriority(char a){
    if(a == + || a==-){
        return 0;
    }else{
        return 1;
    }
}
int calSub(float opand1,char op,float opand2,float &result){
    if(op == +)     result =opand1+opand2;
    if(op == -)    result =opand1-opand2;
    if(op == *)    result=opand1*opand2;
    if(op == /){
        if(fabs(opand2)<MIN){
            return 0;
        }else{
            result=opand1/opand2;
        }
    }
    return 1;    
}
int calStackTopTwo(float s1[],int &top1,char s2[],int &top2){
    float opand1,opand2,result;
    char op;
    int flag;
    opand2=s1[top1--];
    opand1=s1[top1--];
    op=s2[top2--];
    flag=calSub(opand1,op,opand2,result);
    if(flag == 0){
        cout<<"ERROR"<<endl;
        return 0;
    }
    s1[++top1]=result;
    return flag;
}
float calInfix(char exp[]){
    float s1[MaxSize]; int top1=-1;
    char s2[MaxSize]; int top2=-1;
    int i=0;
    while(exp[i]!=\0){
        if(0<=exp[i] && exp[i]<=9){
            s1[++top1]=exp[i]-0;
            ++i;
        }else if(exp[i] == (){
            s2[++top2]=(;
            ++i;
        }else if(exp[i] == +||exp[i] ==-||exp[i]==*||exp[i]==/){
            if(top2 == -1 ||s2[top2] ==(||getPriority(exp[i])>getPriority(s2[top2])){
                s2[++top2]=exp[i];
                ++i;
            }else{
                int flag=calStackTopTwo(s1,top1,s2,top2);
                if(flag == 0){
                    return 0;
                }
            }
        }else if(exp[i] ==)){
            while(s2[top2] !=(){    
                int flag=calStackTopTwo(s1,top1,s2,top2);
                if(flag == 0){
                    return 0;
                }
            }
            --top2;//左括号丢掉
            ++i; 
        }
    }
    while(top2!=-1){
        int flag=calStackTopTwo(s1,top1,s2,top2);
        if(flag == 0){
            return 0;
        }
    }
    return s1[top1];
}

2.用Stack求后缀表达式的值

技术图片

 

 

int calSub(float opand1,char op,float opand2,float &result){
    if(op == +)     result =opand1+opand2;
    if(op == -)    result =opand1-opand2;
    if(op == *)    result=opand1*opand2;
    if(op == /){
        if(fabs(opand2)<MIN){
            return 0;
        }else{
            result=opand1/opand2;
        }
    }
    return 1;    
}
float calPostFix(char exp[]){
    float s[MaxSize];int top=-1;for(int i=0;exp[i]!=\0;++i){
        if(0<=exp[i] &&exp[i]<=9){
            s[++top]=exp[i]-0;
        }else{
            float opnd1,opnd2,result;
            char op;
            int flag;
            opnd2=s[top--];
            opnd1=s[top--];
            op=exp[i];
            flag=calSub(opnd1,op,opnd2,result);
            if(flag == 0){
                cout<<"ERROR"<<endl;
            }
            s[++top]=result;
        }    
    }
    return s[top];
}

3.用Stack求前缀表达式的值

不同点:从右往左扫描,先出栈的排左边,后出栈的排右边。

float calPreFix(char exp[],int len){
    float s[MaxSize];int top=-1;
    int i=len-1;
    for(i;i>=0;i--){
        if(0<=exp[i] &&exp[i]<=9){
            s[++top]=exp[i]-0;
        }else{
            float opnd1,opnd2,result;
            char op;
            int flag;
            opnd2=s[top--];
            opnd1=s[top--];
            op=exp[i];
            flag=calSub(opnd2,op,opnd1,result);
            if(flag == 0){
                cout<<"ERROR"<<endl;
            }
            s[++top]=result;
        }    
    }
    return s[top];
}

 

Stack实现表达式的求值

标签:inf   span   后缀   ima   max   lazy   tac   中缀表达式   不同   

原文地址:https://www.cnblogs.com/jcahsy/p/13187655.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!