1. 程式人生 > >C語言實現括號匹配,中綴表示式轉字尾表示式並計算的演算法

C語言實現括號匹配,中綴表示式轉字尾表示式並計算的演算法

1.將中綴表示式轉換為字尾表示式的演算法:

(1) 初始化兩個棧:運算子棧S1和儲存中間結果的棧S2;

(2) 從左至右掃描中綴表示式;

(3) 遇到運算元時,將其壓入S2;

(4) 遇到運算子時,比較其與S1棧頂運算子的優先順序:

Ø (4-1)如果S1為空,或棧頂運算子為左括號“(”,則直接將此運算子入棧;

Ø (4-2)否則,若優先順序比棧頂運算子的高,也將運算子壓入S1(注意轉換為字首表示式時是優先順序較高或相同,而這裡則不包括相同的情況);

Ø (4-3)否則,將S1棧頂的運算子彈出並壓入到S2中,再次轉到(4-1)與S1中新的棧頂運算子相比較;

(5) 遇到括號時:

Ø 如果是左括號“(”,則直接壓入S1;

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

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

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

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

例如,要對錶達式5*(13+4)/3-7求值,利用上述演算法,轉換為字尾表示式的過程為:


2.字尾表示式的計算機求值演算法

從左至右掃描表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算(次頂元素 op 棧頂元素),並將結果入棧;重複上述過程直到表示式最右端,最後運算得出的值即為表示式的結果。

例如字尾表示式“5 13 4 +*3 /7-”:

(1) 從左至右掃描,將5、13和4壓入堆疊;

(2) 遇到+運算子,因此彈出4和13(4為棧頂元素,13為次頂元素,注意與字首表示式做比較),計算出13+4的值,得17,再將17入棧;

(3) 接下來是*運算子,因此彈出17和5,計算出5*17=-85,將85入棧;

(4) 將3入棧

(5) 接下來是/運算子,因此彈出3和85,計算出85/3=28,將28入棧;

(6) 將7入棧

(7) 最後是-運算子,因此彈出7和28,計算出28-7=21,由此得出最終結果

下一篇為具體原始碼