「中序表示式」轉換為「前序表示式」 「後序表示式」

2022-07-23 02:48:12 字數 2171 閱讀 2465

首先看下面所示**:

中序表示式

2*3/(2-1)+3*(4-1)

前序表示式

+/*23-21*3-41

後序表示式

23*21-/341-*+

中序表示式對我們而言是很直觀的(我們平時接觸的就是這個),但計算機處理起來比較麻煩(括號、優先順序之類的),前序和後序表示式中沒有括號,而且在計算中只需單向掃瞄,不需要考慮運算子的優先順序。

以前序表示式「+/*23-21*3-41」為例,從右往左,先取出兩個運算元「1」、「4」和乙個運算子「-」,計算「4-1」,將結果3回填到字串中,現在字串變為「+/*23-21*33」。

再從右至左取兩個數「3」、「3」和「*」,計算「3*3」,將結果「9」回填到字串,得「+/*23-219』」,

再取數,連續取出「9」、「1」、「2」,直到取出乙個運算子「-」,將與運算子最近的兩個運算元進行計算,即「2-1」得「1」,回填字串中,現在為「+/*239」

重複上述步驟,取出「2*3」=6,回填字串得到「+/619」,

再取「6/1」=6,得到「+69」,

再取「6+9」=15。運算完畢。

從右至左取數,直到取出乙個運算子,將剛取出的緊挨著運算子的兩個運算元按運算子進行計算,結果回填至運算子。重複該步驟,直到最後只剩下乙個字串則剩下的字串即為結果。

後序表示式的字串掃瞄方式正好和前序相反,是從左往右掃瞄,規則類似。

中序表示式轉前序表示式步驟

1、反轉輸入字串,如「2*3/(2-1)+3*(4-1)」 反轉後為「 )1-4(*3+)1-2(/3*2」,

2、從字串中取出下乙個字元

2.1.如果是運算元,則直接輸出

2.2.如果是「)」,壓入棧中

2.3.如果是運算子但不是「(」,「)」,則不斷迴圈進行以下處理

2.3.1.如果棧為空,則此運算子進棧,結束此步驟

2.3.2.如果棧頂是「)」,則此運算子進棧,結束此步驟

2.3.2.如果此運算子與棧頂優先順序相同或者更高,此運算子進棧,結束此步驟

2.3.4.否則,運算子連續出棧,直到滿足上述三個條件之一,然後此運算子進棧

2.4、如果是「(」,則運算子連續出棧,直到遇見「)」為止,將「)」出棧且丟棄之

3、如果還有更多的字串,則轉到第2步

4、不在有未處理的字串了,輸出棧中剩餘元素

5、再次反轉字串得到最終結果

我第一次看到這個的時候就沒看懂是什麼意思,在網上查了點,又瞪了它好久才明白了,就以「2*3/(2-1)+3*(4-1),」為例做以下說明:

2*3/(2-1)+3*(4-1),反轉得「 )1-4(*3+)1-2(/3*2 」;

取第乙個字串為「)」,入棧(此時棧中為「)」);

取下乙個「1」,是運算元,直接輸出(目前輸出「1」);

取下乙個「-」,既不是「)」,也不是「(」,則轉到2.3,此時棧頂為「)」,則該運算子進棧(棧中為「-、)」);

取下乙個「4」,直接輸出(目前輸出的是「14」);

取下乙個「(」,運算子連續出棧(棧中此時為「-、)」),直到遇見「)」,此時輸出「-」(目前輸出「14-」,棧為空);

取下乙個「*」,既不是「)」,也不是「(」,則轉到2.3,進棧(棧為空);

取下乙個「3」,直接輸出(目前輸出「14-3」);

取下乙個「+」,此時棧頂為「*」,「+」的優先順序比「*」低(2.3.4),則運算子連續出棧(只有乙個*出棧,此時棧為空符合2.3.1,繼續下一步),「+」進棧;

取下乙個「)」,進棧(此時棧中為「)、+」);

取下乙個「1」直接輸出(目前輸出為14-3*1);

取下乙個「-」,此時棧頂為「)」,「-」進棧(棧中此時為「-、)、+」);

取下乙個「2」,直接輸出(目前輸出「14-3*12」);

取下乙個「(」,運算子連續出棧,直到遇見「)」,此時棧中為「-、)、+」,輸出-,且拋棄「)」,此時輸出為「14-3*12-」,棧中為「+」;

取下乙個「/」,優先順序比棧頂「+」高,此運算子進棧;

取下乙個「3」,直接輸出(此時輸出「14-3*12-3」);

取下乙個「*」,優先順序比棧頂「+」高,此運算子進棧;

取下乙個「2」,輸出(此時輸出「14-3*12-32」);

不在有未處理的運算子,輸出棧中剩餘元素,結果的「14-3*12-32*/+」;

反轉字串的「+/*23-21*3-41」。

前序表示式 中序表示式 後序表示式

執行完成後,先輸出佇列內容,在輸出棧內容,最終結果即是後序表示式 先序表示式 後序表示式 public string infixtopostfix string elements if s.equals continue 碰到 或 運算子 if s.equals s.equals while sta...

中序表示式轉後序表示式

演算法的思想是這樣的 演算法分為兩個棧,乙個opstack為操作符棧,另一numstack為運算元棧,隨著程式執行運算元棧中里也會有操作符,這是因為小運算元和操作符化作了更大的運算元。如果需要求值,就會將運算元計算出結果,而由於此演算法只是求表示式,所以就保留了操作符。每一次彈出棧時都會涉及到操作符...

表示式轉換 中綴表示式轉換為字尾表示式

算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入格式 輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。輸出格式 在一行中輸出轉換後的字尾表示式,...