逆波蘭表示式筆記

2022-07-17 20:24:11 字數 2353 閱讀 3166

網上找了一些資料,摘錄下來做筆記,出處已不可考,如果有侵犯到作者版本,請告知[email protected]

逆波蘭表示式

逆波蘭對這種字串的表示式計算很容易,只要把乙個普通的表示式轉換成逆波蘭後計算就輕鬆很多!

首先看一下普通表示式:(1+2)*(2-1) 轉成逆波蘭後變成 1 2 + 2 1 - *

下面說說怎麼轉成逆波蘭,然後再說計算逆波蘭!

假設要轉的表示式是一條合法的表示式(這個自己事先寫個**判斷表示式的合法性),那麼遵照下面的規則就可以轉成逆波蘭了:

1.首先把普通的表示式按照運算子分離出來放在乙個集合e中,比如1+2*3 分離後集合裡的元素就是 1 + 2 * 3 五個元素

2.再定義乙個集合r(最好是字串型別的集合,免得後面要轉型別),主要是用來存放逆波蘭表示式的,還有定義乙個堆疊(儲存運算子用),最後從左到右遍歷集合e

3.遍歷e的規則如下:

3.1如果該元素是數字,直接把它新增到集合r中

3.2否則它肯定是運算子,那麼再進行判斷

3.2.1如果該元素是左括號,或者當時棧為空,那麼直接入棧

3.2.2如果該元素是右括號,則把棧內的運算子出棧並新增到集合r中,直到遇到第乙個左括號結束(左括號也出棧但不新增到r)

3.2.3否則該元素是普通的運算子(也就是+-*/之類的),那麼用該運算子和棧內的運算符號比較優先順序(至於怎麼比較它們的優

先級,你可以定義乙個函式,傳乙個運算子過去,返回乙個int,int值越大優先順序越高),如果該運算子的優先順序比棧內的運

算符優先順序高 或者 棧為空,則直接入棧,否則把棧內的運算子出棧並新增到r中,再判斷下個棧內的運算子優先順序,直到遇

棧內的運算子優先順序<=該運算子或者棧為空時再把該運算子入棧

3.3整個過程完成後,再把棧內的所有運算子出棧並新增到r中

下面看著表示式來理解上面的步驟

運算子優先順序:

( ) 1

+ - 2

* / % 3

值越大優先順序越高,注意括號優先順序是最低的

表示式:2*(1+2/2)

定義集合e儲存分離的表示式,e

定義集合r儲存逆波蘭, r

定義堆疊s儲存運算子, s

從左到右遍歷e,開始判斷

e[0]是數字2,直接新增到r,r

e[1]是乘號,和棧內運算子比較優先順序,這時棧為空,所有直接入棧,s

e[2]是左括號,直接入棧,s

e[3]是數字1,直接新增到r,r

e[4]是加號,比較棧頂運算子,棧頂為"(",加號比它優先順序高,所有直接入棧, s

e[5]是數字2,直接新增到r, r

e[6]是除號,比較棧頂運算子,棧頂為"+",除號》加號,直接入棧, s

e[7]是數字2,直接新增到r,r

e[8]是右括號,把棧內運算子出棧並新增到r直到遇到第乙個左括號,r s,注意左括號出棧但不加到r

那麼整個過程就完畢,最後一步把棧內的所有元素新增到r

r s那麼表示式2*(1+2/2) 轉逆波蘭變成 2 1 2 2 / + *

計算逆波蘭非常簡單,也需要乙個堆疊,規則是:

1.從左到右遍歷r

2.如果該元素是數字,直接入棧

3.如果該元素是運算子,出棧兩個數,計算結果再入棧,逆波蘭遍歷完後棧內的元素就是表示式的值了

如:r1.數字就入棧,那麼s

2.除號,出棧兩個2 / 2 = 1,再入棧 s

3.加號,出棧兩個1 + 1 = 2,再入棧s

4.乘號,出棧兩個2 * 2 = 4,再入棧s

5.逆波蘭已遍歷完,棧內元素是4,對照下普通表示式的運算結果是否相同?

關於預處理問題

轉換成逆波蘭前必須先要處理一下

a.比如你要分離普通表示式的時候,負號和減號是相同的,得把減號用其他符號代替,怎麼判斷是減號還是負號?很簡單,從右往左遍歷,遇到"-"時再判斷它的前乙個符,如果是數字或者右括號,那麼它就是減號!

b.如果表示式的第乙個符是負號,也就是形如-(1+2),那麼根據上面第一條的判斷它為負號而不是減號,分離這個表示式時就會變成 - ( 1 + 2 ),負號就會被獨立分離出來,這樣轉逆波蘭是沒有問題,但是計算逆波蘭就有問題,它會被轉成逆波蘭為:- 1 2 +的樣子,因為負號會被認為是運算子,所以把棧內元素出棧計算,這時棧根本就是為空的,就會出異常!解決辦法是如果表示式的第乙個符號為負號,在整個表示式前面加乙個0,就會變成

0-(1+2),這樣根據a判斷"-"就會被當成是減號而不是負號,0減去後面的數不就是負數了嘛!

c.類似第2條,看下形如1*-(-(-(1+2)))這樣的表示式,根據a的判斷"-"會被當成負號,顯然,和b一樣,也會出現一樣的錯誤,解決辦法還是加0,首先判斷如果它是負號,再判斷它後面是數字還是運算子,如果是運算子就在負號前面加個0,那麼整個下來表示式就會變成1*0-(0-(0-(1+2)))

波蘭表示式 逆波蘭表示式

中綴表示式是最常見的運算表示式,如 3 5 2 6 1 波蘭表示式又稱為字首表示式,它是由中綴表示式經過一定的方式轉換來的 比如中綴表示式為 3 5x 2 6 1 對應的字首表示式為 3 x 5 2 6 1 對於中綴表示式從右向左遍歷轉換為字首表示式,中途要是用棧進行儲存 轉換規則如下 波蘭表示式 ...

波蘭逆波蘭表示式

實現乙個基本的計算器來計算簡單的表示式字串。表示式字串只包含非負整數,算符 左括號 和右括號 整數除法需要 向下截斷 你可以假定給定的表示式總是有效的。所有的中間結果的範圍為 231,231 1 class solution s2.push s.substr l,r l l r 碰見符號 else ...

波蘭表示式與逆波蘭表示式

2018年09月03日 11 29 15 jitwxs 閱讀數 70 標籤 波蘭 字首 更多 個人分類 演算法與資料結構 常見的算術表示式,稱為中綴表示式,例如 5 6 4 2 3波蘭表示式也稱為字首表示式,以上面的例子為例,其波蘭表示式為 5 6 4 2 3中綴表示式轉換字首表示式的操作過程為 1...