注:這里只是簡單的加減乘除運算即含小括號的情況,並沒有考慮單目運算符的情況。
中綴表達式化后綴表達式:
(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作為左操作數和右操作數,做相應計算后,將結果入棧,最后處理到最左側時,棧頂即為表達式值。