字首 中綴 字尾表示式之間的相互轉換及部分實現

2021-10-07 12:34:19 字數 3069 閱讀 4118

字首表示式(又稱為波蘭表示式)

中綴表示式

字尾表示式(又稱為逆波蘭表示式)

平時我們見到的都是:2+3*5,這樣的算數表示式(中綴),我們數學中也就是用這種

這種表示式(中綴)只適合人來讀寫,不適合計算機,所以為了方便計算機讀取正確的表示式就有了字首和字尾表示式

字首轉中綴,中綴轉字首

中綴轉字尾,字尾轉中綴

前字尾之間的相互轉換可以用中綴作為中間商來解決,或者也可以構造語法樹遍歷來解決

字首轉字尾的具體實現**(構造樹實現)

例子:2+(3-1)*4(中綴,語法樹中序遍歷可以得到)

231-4 * + (字尾,語法樹後序遍歷可以得到,其他方法得到也行,表示式不唯一)

+2*-314 (字首,語法樹先序遍歷可以得到)

為了方便理解,我畫了表示式的 語法樹:

葉子節點都是數,非葉子節點都是運算子。畫圖很簡單就不贅述了

如果僅僅是寫題目,僅需把語法樹用前序遍歷(又稱為先序遍歷)一遍即可得到答案 +2*-314(字首表示式)

但一般實現是使用棧

思路:首先要處理字串,運算子的優先順序,多位數字看成整體(比如23看成乙個整體而不是2和3),我的例子中沒那麼複雜

建立兩個棧,乙個是數字棧(裡面存的是最終結果),乙個是運算子棧

從右往左 掃瞄中綴表示式

若是運算子,則與運算子棧頂元素比較優先順序:

若該運算子優先順序大於等於棧頂元素,則將該運算子入棧;

若該運算子優先順序小於棧頂元素,則運算子棧內元素出棧並壓入數字棧,再與其比較,直到該運算子優先順序大於等於棧頂元素的優先順序時,將該運算子壓入棧中。

注意:我們先在運算子棧中壓入乙個『#』 規定其優先順序為最低 這樣解決了開始時候的邊界問題)

注意:遇到右括號直接壓入棧中,遇到乙個左括號,那麼就將運算子棧元素彈出並壓入數字棧直到遇到右括號,並且把右括號彈出,停止彈出。這個過程,兩個括號都不加入數字棧。

表示式遍歷完後,若運算子棧還有元素,則依次彈出壓入數字棧。

把數字棧元素從棧頂依次彈出,就得到字首表示式。

**實現:

例:1-(2+3) 轉換字首是:- 1 + 2 3

例:1+((2+3)*4)-5 轉換字首是:- + 1 * + 2 3 4 5

例:123+((246+39)*48)-55 轉換字首是:- + 123 * + 246 39 48 55

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1005

;typedef

struct nodenode;

node node[maxn]

;string s;

intchange()

else

if(s[i]

=='+'

||s[i]

=='-'

)else

if(s[i]

=='('

||s[i]

==')'

)else

if(s[i]

>=

'0'&&s[i]

<=

'9')

node[w1]

.ch=s.

substr

(i,j-i)

; node[w1]

.level=

100;

w1++

; i=j-1;

}}return w1;

}void

solove

(int l)

else

w3--;}

else

q[w3++

]=node[i];}

}}while

(w3!=1)

for(

int i=w2-

1;i>=

0;i--

)return;}

intmain()

(這一點網上的資料很少)

例子:+2*-314(字首)-----> 2+((3-1)*4)(中綴)

思路:準備乙個棧

從右往左掃瞄字首表示式

遇見數字壓入數字棧

遇見運算子棧,則彈出數字棧的兩個元素,並且運算,前後還要新增括號,然後壓入棧

例如:棧中有2和3(2個元素),現在遇見+了,則把 (2+3) 壓入棧,棧中現在就有5個元素了,後面的依次類推

結果中肯定會出現很多多餘的括號,也可以解決但是比較複雜就不詳細說了

**實現:

實現起來較為複雜,有機會補上…

寫答案的話後序遍歷的語法樹,可以直接得到答案

思路:和中綴轉字首差不多,只是方向改變了

從左往右掃瞄中綴表示式

其他的與中綴轉字首的操作一樣

這裡有一篇**部落格,方便大家理解

思路:

與字首轉中綴的思路一樣

從右往左掃瞄字尾表示式

遇見數字壓入數字棧

遇見運算子棧,則彈出數字棧的兩個元素,並且運算,前後還要新增括號,然後壓入棧

例如:棧中有2和3(2個元素),現在遇見+了,則把 (2+3) 壓入棧,棧中現在就有5個元素了,後面的依次類推

1 2 3 + 4 *5 - +

例如:

從左往右掃瞄先碰到+號,取+號前面兩個運算元:2,3 得到:(2+3).

繼續往下掃碰到*號,取4 和2+3 得到:((2+3)*4)

-號,取(2+3)*4和5得到::(((2+3)*4)-5))

+號:取(2+3)*4-5和1得到::1+(((2+3)*4)-5))

如果把多餘的括號省略就是1+(2+3)*4-5

如有錯誤,不吝賜教

中綴 字首 字尾表示式 相互轉換

1.中綴表示式 便於人看 2.字首表示式 波蘭式 運算子在前面,運算數在後面 3.字尾表示式 逆波蘭式 運算數在前面,運算子在後面 中綴 字首 優先順序先乘除再加減,入棧方向從右往左,棧外的符號想進棧,棧內的符號想出棧。棧外左括號不能進棧,棧外右括號優先順序最高。棧內右括號優先順序最低。中綴 字尾 ...

算術表示式的字首,中綴,字尾相互轉換

中綴表示式 中綴記法 中綴表示式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處於運算元的中間。中綴表示式是人們常用的算術表示方法。雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。...

字首 中綴 字尾表示式的相互轉換方法

乙個中綴式到其他式子的轉換方法 這裡我給出乙個中綴表示式 a b c d e 第一步 按照運算子的優先順序對所有的運算單位加括號 式子變成 a b c d e 第二步 轉換字首與字尾表示式 把運算符號移動到對應的括號前面 則變成 a b c d e 把括號去掉 a b c d e 字首式子出現 把運...