字首 中綴 字尾表示式

2021-08-07 22:19:05 字數 2727 閱讀 2246

算是複習吧=。=

先是看了這個部落格。部落格給出了中綴轉成字首、字尾表示式的方法(大概和教科書一樣)。看了兩遍,還是不能完全記住兩種表示式的轉換流程……emmmmmm,想想怎麼理解這兩種轉換方法。

使用上述部落格中的例子,要計算中綴表示式的值,先將其轉換為字首或者字尾表示式:

觀察三種表示式, 前、字尾表示式和中綴表示式中的數字順序不變(所以記得最後要調整回原來的順序),前字尾是運算子相對於數字而言的。

計算表示式(前、字尾)時,遍歷表示式,遇到運算元則壓棧(運算元棧),遇到運算子則從棧頂彈出兩個運算元,計算後壓棧。繼續遍歷,直到結束。(1. 遍歷:從運算元開始遍歷。對於字首表示式,運算元在後,從末尾往前遍歷;對於字尾表示式,運算元在前,從前往後遍歷。 2. 計算:運算元計算的順序和表示式一致。所以對於字首表示式,棧頂的運算元在表示式中較前的位置,計算時棧頂op次頂;對於字尾表示式,棧頂的運算元在表示式中較後的位置,計算時次頂op棧頂。)

運算元順序不變,所以轉換過程中,遇到運算元直接壓棧。

需要兩個棧,乙個儲存運算子s1,兩乙個儲存中間結果s2.

關於轉換的起始位置,字首是從最後乙個開始,字尾是從第乙個開始。

中綴-字首表示式轉換

如何確定轉換順序?回到表示式的計算方式,兩種表示式計算時進行的每一步運算都是相同的!!!決定計算順序的是運算子的位置。對於字首表示式,從末尾開始遍歷,遇到數字則壓棧,遇到乙個運算子將棧頂和次頂取出計算。在中綴-字首轉換時,運算元的入棧s2順序,應該和計算時一致,即從中綴表示式末尾開始

關於運算子,先不考慮括號。優先順序高的先計算,怎麼體現先計算呢?還是回到字首表示式的計算,一旦遇到運算子就進行計算,所以優先順序高的運算子先壓入s2;優先順序相同,理論上計算順序不重要。

什麼時候將運算子壓入s2?不考慮括號,從右往左遍歷,遇到運算元直接壓入s2,遇到第乙個運算子時,s2中只有乙個運算元,此時不應將運算子壓入s2,先把操作符壓入s1儲存。壓入下乙個運算元。

對於第二個運算子,有三種情況:

第乙個優先順序相同,則可以先將之前的兩個運算元用第乙個運算子進行計算,將第乙個運算子從s1彈出,壓入s2;

優先順序高於第乙個運算子,說明前兩個運算元當前不應該計算,將當前運算子壓入s1;

優先順序低於第乙個運算子,之前比當前優先順序高的都可以從s1彈出,壓入s2,再將當前運算子壓入s1.

更一般的說,就是,將s1中優先順序大於等於自身的運算子彈出,壓入到s2,將當前運算子壓入s1,最後將s1中剩餘運算子彈出,壓入s2。(注意:部落格中給出的演算法是將s1中優先順序大於自身的部分彈出到s2中,與彈出優先順序大等於自身相比,式子的結果不變,但前者可以保證計算順序是從左到右計算(猜測,待驗證))

特別的,對於括號,括號內的運算應該先完成。怎樣先完成運算?將運算子壓入s2,即可認為當前運算子負責的運算完成。所以出現左括號時,將s1中最後乙個右括號之後的運算子都彈出並壓入s2,丟棄右括號。字首表示式從後開始遍歷,先遇到右括號,直接壓入s1;遇到左括號時,將s1中的運算子彈出,壓入到s2,直到右括號結束。

括號的優先順序?新壓入運算子發現s1棧頂為右括號,應該壓入s1,可以認為右括號優先順序比所有運算子低。當右括號不處於棧頂,且右括號之後的所有運算子優先順序都高於當前運算子時,彈出s1到右括號的下乙個。

最後是部落格中提到的轉換方法:

初始化兩個棧:運算子棧s1和儲存中間結果的棧s2;

從右至左掃瞄中綴表示式;

遇到運算元時,將其壓入s2;

遇到運算子時,比較其與s1棧頂運算子的優先順序:

4.1 如果s1為空,或棧頂運算子為右括號「)」,則直接將此運算子入棧;

4.2 否則,若優先順序比棧頂運算子的較高或相等,也將運算子壓入s1;

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

遇到括號時:

5.1 如果是右括號「)」,則直接壓入s1;

5.2 如果是左括號「(」,則依次彈出s1棧頂的運算子,並壓入s2,直到遇到右括號為止,此時將這一對括號丟棄;

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

將s1中剩餘的運算子依次彈出並壓入s2;

依次彈出s2中的元素並輸出,結果即為中綴表示式對應的字首表示式。

中綴-字尾表示式轉換

與中綴-字首表示式轉換類似的思路,這裡僅列出轉化流程:

初始化兩個棧:運算子棧s1和儲存中間結果的棧s2;

從左至右掃瞄中綴表示式;

遇到運算元時,將其壓入s2;

遇到運算子時,比較其與s1棧頂運算子的優先順序:

4.1 如果s1為空,或棧頂運算子為左括號「(」,則直接將此運算子入棧;

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

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

遇到括號時:

5.1 如果是左括號「(」,則直接壓入s1;

5.2 如果是右括號「)」,則依次彈出s1棧頂的運算子,並壓入s2,直到遇到左括號為止,此時將這一對括號丟棄;

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

將s1中剩餘的運算子依次彈出並壓入s2;

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

對於第4步,在新運算子與s1中的運算子比較優先順序時,彈出優先順序大等於新運算子的符號,所以有點想

字首 中綴 字尾表示式

它們都是對表示式的記法,因此也被稱為字首記法 中綴記法和字尾記法。它們之間的區別在於運算子相對與運算元的位置不同 字首表示式的運算子位於與其相關的運算元之前 中綴和字尾同理。舉例 3 4 5 6 就是中綴表示式 3 4 5 6 字首表示式 3 4 5 6 字尾表示式 中綴表示式 中綴記法 中綴表示式...

字首 中綴 字尾表示式

最近筆試的過程中老是有中綴轉換為字首,或是中綴轉換為字尾的問題,資料結構學了這麼久真的是記不清了,今天重新複習了一下,藉此機會總結一下 中綴 我們正常理解的表示式的書寫方式 字首 操作符全部位於運算元的前面,運算元的順序為從右到左依次壓棧的順序,操作符為從左到右依次壓棧的順序 字尾 不包含括號,運算...

字首 中綴 字尾表示式

它們都是對表示式的記法,因此也被稱為字首記法 中綴記法和字尾記法。它們之間的區別在於運算子相對與運算元的位置不同 字首表示式的運算子位於與其相關的運算元之前 中綴和字尾同理。舉例 3 4 5 6 就是中綴表示式 3 4 5 6 字首表示式 3 4 5 6 字尾表示式 中綴表示式 中綴記法 中綴表示式...