四則運算表示式求值(字尾表示式 逆波蘭表示法)

2021-10-05 05:48:41 字數 2367 閱讀 6647

小學的時候我們就學過數**算的規則:先乘除後加減,從左算到右,先括號內後括號外。對於9 + (3 - 1) × 3 + 10 ÷ 2這樣乙個表示式,我們很快就知道結果是20。但是在計算機內部,是如何計算的呢?

20世紀50年代,波蘭邏輯學家jan łukasiewicz想到了一種不需要括號的字尾表示法,我們稱之為逆波蘭表示(reverse polish notation, rpn),非常巧妙地解決了程式實現四則運算的難題。

對於表示式9 + (3 - 1) × 3 + 10 ÷ 2,如果用字尾表示法是這個樣子的:9 3 1-3 × + 10 2 ÷ +,這樣的表示式稱為字尾表示式,叫字尾的原因在於所有的符號都是在要運算的數字的後面出現。

我們來看看計算機是如何應用字尾表示式計算出結果的。

規則:從左到右遍歷表示式的每個數字和符號,遇到是數字就進棧,是符號就將處於棧頂的兩個數字出棧進行運算,然後將運算結果進棧,一直到獲取到最終結果。

1、初始化乙個空棧,用來對要運算的數字進出使用,如下左圖。

2、字尾表示式的前三個都是數字,因此9、3、1進棧,如下右圖:

3、接下來是-,所以將棧中的1出棧作為減數,3出棧作為被減數,並將運算結果2進棧。

4、接下來是數字3進棧。

5、後面是×,所以棧中3和2出棧並相乘,將結果6入棧。

6、下面是+,所以棧中6和9出棧相加,將結果15入棧。

7、接著是10和2進棧。

8、接下來是符號÷,棧頂的2與10出棧,10與2相除,得到5,將5進棧。

9、最後乙個是符號+,所以5與15出棧並相加,得到結果20,20進棧。

10、結果是20出棧,棧為空。

那麼,字尾表示式是如何的來的呢?

我們平時使用的標準四則運算表示式叫做中綴表示式,因為所有的運算子都在兩個數字的中間,現在的問題就是將中綴表示式轉為字尾表示式。

規則:從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,稱為字尾表示式的一部分;若是符號,則判斷其與棧頂符號的優先順序,是右括號或優先順序不高於棧頂符號則棧頂元素依次出棧並輸出,並將當前符號進棧,一直到最終輸出字尾表示式為止。

1、初始化乙個空棧,用來對符號進出棧使用。

2、第乙個字元是9,輸出9,後面是符號+,進棧。

3、第三個符號是(,因其是左括號,所以入棧。

4、第四個符號是數字3,輸出。接著是-,進棧。

5、接下來是數字1,輸出。後面是符號),此時,我們需要去匹配前面的(,所以,棧頂元素依次出棧並輸出,直到(出棧為止。此時(上方只有-,因此輸出-。

6、緊接著是符號×,因為此時棧頂符號是+,優先順序低於×,因此×進棧。接著是數字3,輸出。

7、之後是符號+,此時當前棧頂元素的×比+優先順序高,因此棧中元素出棧並輸出。由於沒有比+更低的優先順序,所以全部出棧。然後再將這個+入棧。此時,前面幾張圖中的+是中綴表示式開頭的9後面那個+,而下圖左圖中的+是指剛剛入棧的+,即9 + (3 - 1) × 3 +中後面的乙個+。

8、緊接著是數字10,輸出。後是符號÷,進棧。

9、最後乙個數字2,輸出。

10、因已到最後,因此將棧中符號全部出棧並輸出,最終輸出的字尾表示式是9 3 1-3 × + 10 2 ÷ +。

因此,要讓計算機能處理通常的標準(中綴)表示式的能力,關鍵就是兩步:

1、將中綴表示式轉為字尾表示式(棧用來進出運算符號)

2、將字尾表示式進行運算得出結果(棧用來進出運算的數字)

四則運算表示式求值

03 四則運算表示式求值 輸入輸入為四則運算表示式,僅由陣列 四則運算符 左右括號組成,不含空格。假設運算子結果都是整數。輸出輸出這個表示式的值 分析首先我們要搞清楚表示式的定義是什麼 表示式 由乙個或者多個項組成,多個項的表示式由 連線 項 由乙個或者多個因子組成,多個因子由 連線 因子 由 表示...

四則運算表示式求值

表示式求值是關於棧的應用,涉及到中綴與字尾式的轉換,本文關於10以內不帶括號的四則運算。9 3 4 x 3 24 1 x 9 5 9 9 5 x 9 4 6 2 x 3 1 42 思路 遇到數字直接入數字棧。遇到運算子,第乙個運算子直接入符號棧,後面的需要與符號棧棧頂元素比較優先順序。若當前優先順序...

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

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