逆波蘭表示式

2021-06-05 17:14:11 字數 1655 閱讀 8836

逆波蘭表示式(reverse polish notation,rpn)

逆波蘭表示式:字尾表示式

正常表示式:中綴表示式

正常表示式

逆波蘭表示式

逆波蘭表示式作用:將複雜表示式轉換為可以依靠簡單的操作得到計算結果的表示式。我的理解就是不用括號就能決定運算順序。

這樣就能通過入棧和出棧搞定任何普通表示式的運算。如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後,棧裡的就是結果。

逆波蘭表示式若以二叉樹的形式表示,運算元為葉子,算符為根和分枝。

計算機檢索中,一般利用福島演算法對檢索表示式進行逆波蘭求解。 如(a+b)*(c+d).,則結果為:ab+cd+*.

定義運算元和算符兩個棧,它們都是「後進先出表」。算符棧是乙個臨時堆疊,主要用來重新排列運算子,以便確定運算順序。運算元棧用來存放經過編碼後的運算元和表示式。一般表示式的處理過程如下:

(1)從左到右逐個掃瞄提問式的字元,然後予以適當轉移。

(2)如果是運算元,則將其送入運算元棧。

(3)如果是算符,則將其與算符棧棧頂的那個算符按優先順序進行比較:若比棧頂運算子優先順序高,則把它送入算符棧;若等於或低於棧頂運算子的優先順序,則取出棧頂運算子,並從運算元棧中彈出兩個運算元,與棧頂算符一起進行編碼,並將編碼後的結果入運算元棧。接著再將該算符與新的棧頂運算子比較,以此類推。

(4)如果是「(」,則無條件入運算元棧。

(5)如果是「)」,則與該「)」相匹配的「(」間的所有運算子都按照後進先出的次序依次從算符棧彈出,並按上述第三條中算符入運算元棧的規則入運算元棧。

(6)若為表示式的邏輯結束符,則留在算符棧中的運算子按照後進先出的次序依次從算符棧彈出,並按上述第三條中算符入運算元棧的規則入運算元棧。

最後運算元棧中的元素為編碼後的表示式。

假定在檢索算式中僅包含「—」(不包含),「 +」( 或) ,「 * 」( 且) ,「( 」 ,「 ) 」, 「· 」( 結束)運算子。

首先逆波蘭表示式中運算子的優先順序。設定 「 * 」,「 +」,「 一」 ,「 ( 」, 「 ) 」以及 「· 」 的優先順序從高到低,取值分別是 3 、2 、2 、l ,l 和 0。 

之後分配儲存空間,定義所需的變數並初始化。按照前面的資料結構設計,定義乙個儲存空間:stringss,字串變數,作為檢索算式儲存區;r(n,1 ) ,一維陣列,作為 「 逆波蘭式」輸出區 ( 這裡僅輸出字元,不考慮字元型別) 。s( a,2 ) ,二維陣列,作為運算元棧,其中增加的第 2單元用於儲存相應運算子的運算優先順序。此外,除 a、n等陣列維數變數,還定義了l 、i 、s s 、yxj 、flag等變數,其中,l為 stringss長度,i 為計數變數初值為 l ,s s為stringss中擷取的每乙個字元變數,表示運算子的運算優先順序,flag用作標記符,標記前乙個字元是否是運算子。

整個流程如下圖所示:

該流程為foxpro程式流程圖,有時間會把它改為c程式流程圖,但該流程圖不影響理解。已經實現,並測試了它的正確性。

待補充。

波蘭表示式 逆波蘭表示式

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