逆波蘭表示式解決四則運算

2021-08-30 05:33:35 字數 1871 閱讀 4169

逆波蘭表示式又叫做字尾表示式,它將複雜表示式轉換為可以依靠簡單的操作得到計算結果的表示式,解決了四則運算中括號改變運算子優先順序的問題。

四則運算的表示式一般都是中綴表示式如 1+2*(3-4)+5,即操作符在兩個運算元之間。四則運算需要兩個步驟,一是把中綴表示式轉為字尾表示式,二是由字尾表達生成結果

[color=orange][b]中綴表示式轉為字尾表示式演算法描述:[/b][/color]

(1)首先有個包含中綴表示式元素列表sourcelist,然後建立乙個符號列表destlist儲存最終字尾表示式,建立乙個操作符堆疊opstack

(2)從sourcelist取出乙個元素a

(3a)如是數字則加入到destlist中

(3b)如果元素a是運算子,將操作符a與操作符堆疊opstack棧頂的運算子的優先關係相比較。如果,優先關係高於opstack棧頂的運算子,則將該運算子壓入操作符堆疊opstack。倘若不是(低於或等於)的話,則將運算子棧opstack棧頂的運算子從棧中彈出儲存到destlist,重複此步驟,直到作符a壓入操作符堆疊opstack。

(3c)若元素a是左括號"(",則壓入操作符堆疊opstack

(3d)若元素b是右括號")",則操作符堆疊opstack彈出操作符並加入到destlist中,直到彈出左括號"("。

(5)從步驟2重複上述操作,所有元素處理完畢後將操作符堆疊opstack彈出操作符並加入到destlist中,這樣中綴式表示的簡單算術表示式轉化為逆波蘭表示的簡單算術表示式。

示例:中綴表示式如 1+2*(3-4)+5,構造元素列表1,+,2,*,(,3,-,4,),5,構造乙個空最終字尾表示式destlist,乙個操作符堆疊opstack

1、取出「1」,destlist,opstack【】

2、取出「+」,destlist,opstack【+】

3、取出「2」,destlist【1,2】,opstack【+】

4、取出「*」,destlist【1,2】,opstack【+,*】

5、取出「(」,destlist【1,2】,opstack【+,*,(】

6、取出「3」,destlist【1,2,3】,opstack【+,*,(】

7、取出「-」,destlist【1,2,3】,opstack【+,*,(,-】

8、取出「4」,destlist【1,2,3,4】,opstack【+,*,(,-】

9、取出「)」,destlist【1,2,3,4,-】,opstack【+,*】 //操作符堆疊opstack彈出操作符並加入到destlist中,直到彈出左括號"("

10、取出「+」,destlist【1,2,3,4,-,*,+】,opstack【+】 //加號優先順序不大於【+,*】

11、取出「5」,destlist【1,2,3,4,-,*,+,5】,opstack【+】

12、處理完畢,destlist【1,2,3,4,-,*,+,5,+】,opstack【】

[color=orange][b]字尾表示式到計算結果演算法描述:[/b][/color]

遍歷儲存字尾表示式的列表,將元素依次進棧,當遇到操作符時,連續出棧兩個元素,進行運算,再將結果進棧,最後棧內留下的元素就是計算結果

示例:字尾表示式destlist【1,2,3,4,-,*,+,5,+】,結果堆疊resultstatck【】

格式 輸入-->:結果

[1,2,3,4]-->:resultstatck【1,2,3,4】

[-]-->:resultstatck【1,2,3-4】

[ * ]-->:resultstatck【1,2*(3-4)】

[+]-->:resultstatck【1+2*(3-4)】

[5]-->:resultstatck【1+2*(3-4),5】

[+]-->:resultstatck【1+2*(3-4)+5】

四則運算表示式 逆波蘭表示式

感覺是一塊比較偏門的東西,特此記錄下 或者叫字尾表示式,我們原先用的一直都是中綴表示式,但是因為如果表示式過長,計算機計算起來不方便。需要先遍歷一邊,找出其中的 進行優先計算,如果有多個 疊加的話就更麻煩了。於是為了計算機的方便計算,將中綴表示式轉換成字尾表示式,計算機便可以使用棧的特性,來快速的計...

不用逆波蘭表示式計算簡單四則運算

思路很簡單,按 分割,分割完給 分割然後給 最後給 分割,如果分割 後有 就算 有 就算 有 就算 直到結果。這裡有個值得注意的小問題,就是在 的時間,前面有負號和沒有負號,如果有 號,分割後第乙個索引是沒有值的,由於第一位是負號,於是算第乙個數要取反,後面就是都是減了,很簡單如下 public s...

棧的應用 四則運算(逆波蘭表示式)

int compute char s 81 sval valtop y y用來接收轉化的數字 i else if s i s i s i s i 運算子 sop optop s i else if s i else if s i optop i while optop return sval val...