Stack实现表达式的转换

1.Stack实现中缀转后缀

从左至右扫描表达式,遇到操作数直接写出来,若遇到运算符,则入栈(拿当前扫描运算符A和栈顶运算符B相比,若A的优先级小于等于B,则B出栈并写入到当前的结果表达式中,循环该过程直到A优先级大于B',则A入栈)对于表达式中有括号的,遇到'('直接入栈,当栈顶元素为'('所有扫描到的运算符都入栈,当扫描到')'则执行一系列的出栈操作,把当前栈中的从栈顶到'('的都出栈,并写入结果表达式中。'('丢掉不写。最后,若扫描完,栈中还有剩余运算符,则将其全部出栈并写入表达式。

void infixToPostFix(char infix[],char s2[],int &top2){
    char s1[MaxSize];
    int top1=-1;
    int i=0;
    while(infix[i] !='\0'){
        if('0'<= infix[i] && infix[i]<='9'){
            s2[++top2]=infix[i];
            ++i;
        }else if(infix[i] == '('){
            s1[++top1]='(';
            ++i;
        }else if(infix[i] == '+'||infix[i]=='-'||infix[i]=='*'||infix[i]=='/'){
            if(top1 == -1||s1[top1]=='('||getPriority(infix[i])>getPriority(s1[top1])){
                s1[++top1]=infix[i];
                ++i;
            }else{
                s2[++top2]=s1[top1--];
            }
        }else if(infix[i] == ')'){
            while(s1[top1] !='(')
            {
                s2[++top2]=s1[top1--];
            }
            --top1;
            ++i;
        }
        while(top1 != -1){
            s2[++top2]=s1[top1--];
        }
    }
}

2.Stack实现中缀转前缀

与1.相比,顺序从右到左,括号的顺序相反,🔺运算符A<栈顶运算符B,则B出栈也就是说A优先级>B,A入栈

void infixToPreFix(char infix[],int len,char s2[],int &top2){
    char s1[MaxSize];
    int top1=-1;
    int i=len-1;
    while(i>=0){
        if('0'<=infix[i] && infix[i]<='9'){
            s2[++top2]=infix[i];
            i--;
        }else if(infix[i] == ')'){
            s1[++top1]=')';
            --i;
        }else if(infix[i]=='+'||infix[i]=='-'||infix[i]=='*'||infix[i]=='/'){
            if(top1==-1||s1[top1]==')'||getPriority(infix[i])>=s1[top1]){
                s1[++top1]=infix[i];
                --i;
            }else{
                s2[++top2]=s1[top1--];  
            }
        }else if(infix[i] == '('){
            while(s1[top1] !=')'){
                s2[++top2]=s1[top1--];
            }
            --top1;
            --i;
        }
    }
    while(top1 !=-1){
        s2[++top2]=s1[top1--];
    }
}

 

posted on 2020-06-24 10:09  二进制dd  阅读(166)  评论(0编辑  收藏  举报

导航