中綴表達式轉后綴表達式和前綴表達式


 

注:這里只是簡單的加減乘除運算即含小括號的情況,並沒有考慮單目運算符的情況。

中綴表達式化后綴表達式:

    (1+3)/8*3-5=

    構建一個空運算符棧。先向里面壓入一個'='(方便后邊的比較)。然后從左向右掃描中綴表達式,如果是操作數,則直接輸出即可;如果是左括號則直接入棧,如果是右括號,則彈棧,直到左括號且將左括號也彈出;如果是其他運算符,則按照乘除優先於加減,如果是乘除(加減)則按照誰先進棧誰優先,即a優先於b表示為a>b,如果棧頂元素優先於當前元素,則一直彈棧,直到棧頂優先級小於當前元素優先級,將當前元素壓棧,如果優先級相同,只需彈棧就可以了。

/*比較棧頂元素跟當前運算符優先級*/
char suf_compare(char op1,char op2){
    if(op1=='+'||op1=='-'){
        if( op2=='(' || op2=='*' || op2=='/')
            return '<';
        else return '>';
    }
    if(op1=='*'||op1=='/'){
        if(op2=='(')
            return '<';
        else return '>';
    }
    if(op1=='='||op1=='('){
        if((op1=='='&&op2=='=')||(op1=='('&&op2==')')){
            return '=';
        }else{
            return '<';
        }
    }
}

后綴表達式求值:

建立一個緩存計算結果的空棧,從左往右遍歷后綴表達式,如果遇到操作數,就直接壓入棧,如果遇到操作符,就從棧頂依次取出操作數,op1,op2作為右操作數和左操作數,處理到等式右側,最后棧中存的結果,即為所求表達式值。

  

中綴表達式化前綴表達式:

    構建兩個棧,一個緩存運算符空棧(壓入‘=’)和一個存前綴表達式的空棧。從右往左掃描中綴表達式,如果是操作數,則直接壓入表達式棧;如果是右括號,則直接入運算符棧,如果是左括號,則將運算符棧彈棧轉移壓入表達式棧,直到遇到右括號,舍棄括號。如果是其他運算符,則按照乘除優先於加減,如果是乘除(加減)則按照誰后進棧誰優先。如果棧頂元素優先於當前元素,則一直彈棧,直到棧頂優先級小於當前元素優先級,將當前元素壓棧,如果優先級相同,只需彈棧就可以了。最后將表達式棧依次彈棧,就得到了前綴表達式。

/*
中綴化前綴的運算符比較函數,運算符棧棧頂元素跟當前運算符優先級比較。
*/
char pre_compare(char a,char b){
    if(a=='+'||a=='-'){
        if(b=='('||b=='='){
            return '>';
        }else{
            return '<';
        }
    }
    if(a=='*'||a=='/'){
        if(b==')'||b=='*'||b=='/'){
            return '<';
        }else{
            return '>';
        }
    }
    if(a==')'||a=='='){
        if(a==')'&&b=='('||a=='='&&b=='='){
            return '=';
        }else{
            return '<';
        }
    }
}

前綴表達式求值:

建立緩存結果空棧,從右往左處理表達式,如果遇到數字,則將這個數字完整地提取出來,加入棧中,如果是操作符,則從棧頂依次取出op1,op2作為左操作數和右操作數,做相應計算后,將結果入棧,最后處理到最左側時,棧頂即為表達式值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM