逆波蘭表示式

2021-08-27 02:33:33 字數 1487 閱讀 2707

逆波蘭表示式

逆波蘭表示式又叫做字尾表示式

遵照下面的規則就可以轉成逆波蘭了:

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否則該元素是普通的運算子(也就是+-*/之類的),那麼用該運算子和棧內的運算符號比較優先順序,如果該運算子的優先順序比棧內的運算子優先順序高 或者 棧為空,則直接入棧,否則把棧內的運算子出棧並新增到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,對照下普通表示式的運算結果是否相同?

波蘭表示式 逆波蘭表示式

中綴表示式是最常見的運算表示式,如 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...