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


35,15,+,80,70,-,*,20,/                   //后綴表達方式

(((35+15)*(80-70))/20)=25           //中綴表達方式  

/,*,+,35,15,-,80,70, 20                 //前綴表達方式 

人的思維方式很容易固定~~!正如習慣拉10進制。就對2,3,4,8,16
等進制不知所措一樣~~!

人們習慣的運算方式是中綴表達式。而碰到前綴,后綴方式。。迷茫
其實僅僅是一種表達式子的方式而已(不被你習慣的方式)
我這里教你一種也許你老師都沒跟你講的簡單轉換方式

一個中綴式到其他式子的轉換方法~~
這里我給出一個中綴表達式~
a+b*c-(d+e)
第一步:按照運算符的優先級對所有的運算單位加括號~
        式子變成拉:((a+(b*c))-(d+e))
第二步:轉換前綴與后綴表達式
        前綴:把運算符號移動到對應的括號前面
              則變成拉:-( +(a *(bc)) +(de))
              把括號去掉:-+a*bc+de  前綴式子出現
        后綴:把運算符號移動到對應的括號后面
              則變成拉:((a(bc)* )- (de)+ )-
              把括號去掉:abc*-de+-  后綴式子出現
發現沒有,前綴式,后綴式是不需要用括號來進行優先級的確定的。

 

中綴轉前綴

1+((2+3)×4)-5

 

遵循以下步驟:
(1) 初始化兩個棧:運算符棧S1和儲存中間結果的棧S2;
(2) 從右至左掃描中綴表達式;


(3) 遇到操作數時,將其壓入S2;


(4) 遇到運算符時,比較其與S1棧頂運算符的優先級:
(4-1) 如果S1為空,或棧頂運算符為右括號“)”,則直接將此運算符入棧;
(4-2) 否則,若優先級比棧頂運算符的較高或相等,也將運算符壓入S1;
(4-3) 否則,將S1棧頂的運算符彈出並壓入到S2中,再次轉到(4-1)與S1中新的棧頂運算符相比較;


(5) 遇到括號時:
(5-1) 如果是右括號“)”,則直接壓入S1;
(5-2) 如果是左括號“(”,則依次彈出S1棧頂的運算符,並壓入S2,直到遇到右括號為止,此時將這一對括號丟棄;


(6) 重復步驟(2)至(5),直到表達式的最左邊;


(7) 將S1中剩余的運算符依次彈出並壓入S2;
(8) 依次彈出S2中的元素並輸出,結果即為中綴表達式對應的前綴表達式。

 

 

 

中綴轉后綴過程

1+((2+3)×4)-5

與轉換為前綴表達式相似,遵循以下步驟:
(1) 初始化兩個棧:運算符棧S1和儲存中間結果的棧S2;
(2) 從左至右掃描中綴表達式;


(3) 遇到操作數時,將其壓入S2;


(4) 遇到運算符時,比較其與S1棧頂運算符的優先級:
(4-1) 如果S1為空,或棧頂運算符為左括號“(”,則直接將此運算符入棧;
(4-2) 比棧頂高,也將運算符壓入S1         (注意轉換為前綴表達式時是優先級較高或相同,而這里則不包括相同的情況);
(4-3) 比棧頂低或相同,將S1棧頂的運算符彈出並壓入到S2中,再次轉到(4-1)與S1中新的棧頂運算符相比較;


(5) 遇到括號時:
(5-1) 如果是左括號“(”,則直接壓入S1;
(5-2) 如果是右括號“)”,則依次彈出S1棧頂的運算符,並壓入S2,直到遇到左括號為止,此時將這一對括號丟棄;

                                                                     可以想象成“(”比任何運算符都高,“)”比任何運算符都低 。


(6) 重復步驟(2)至(5),直到表達式的最右邊;


(7) 將S1中剩余的運算符依次彈出並壓入S2;


(8) 依次彈出S2中的元素並輸出,結果的逆序即為中綴表達式對應的后綴表達式(轉換為前綴表達式時不用逆序)。

 

 


免責聲明!

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



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