逆波蘭表示的應用

2021-07-08 20:49:41 字數 2002 閱讀 1356

逆波蘭表示式又叫做

字尾表示式

。在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,這種表示法也稱為中綴表示。波蘭邏輯學家j.lukasiewicz於2023年提出了另一種表示表示式的方法,按此方法,每一運算子都置於其運算物件之後,故稱為字尾表示。

逆波蘭表示式最常應用的場景是用於四則運算表示式的求值,其實逆波蘭表達也就是棧的一種應用,逆波蘭表示式是一種新的顯示方式,非常巧妙地解決了程式實現四則運算的難題。

下面我們看乙個例子:計算9+(3-1)* 3 + 10/2的值。

如果使用逆波蘭表示式就可以輕鬆解決這個問題了。通過上面的運算表示式轉化為逆波蘭表示式可以得到的式子為:9 3 1 - 3 * + 10 2 / +,

那麼逆波蘭表示式是如何計算結果的呢,要知道它是如何進行計算首先的要知道它的計算規則:從左到右遍歷表示式的每乙個數字和符號,遇到是數字就進棧,遇到是符號,就將處於棧頂兩個數字出棧,進行運算,運算結果進棧,一直最終獲得結果。

它的計算步驟為:

1、初始化乙個空棧,此棧用來對運算的數字進出使用。

2、逆波蘭表示式中的前三個數字都是數字,所以9、3、1進棧。

3、接下來是「-」 ,所以講棧中的1出棧作為減數,3出棧作為被減數,運算得到2,再將2進棧。

4、接著是數字3進棧。

5、後面是「*」,也就意味著棧中3和2出棧,2與3相乘,得到6,並將6進棧。

6、下面是「+」,所以棧中6和9出棧,9與6相加,得到15,將15出棧。

7、接著是10與2兩個數字進棧。

8、接下來是符號「/」,因此,棧頂的2與10出棧,10與2相除,得到5,將5出棧。

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

10、結果是20出棧,棧變為空,計算完成。

通過上面的步驟,我們發現逆波蘭表示式果然可以和順利的解決計算的問題。那麼新的問題又來了,我們是怎麼得到根據表示式得到逆波蘭表示式的呢,只有解決了這個問題我們才能徹底的明白逆波蘭的使用。

我們把平常所用的標準四則運算表示式,即:「

9+(3-1)* 3 + 10/2

」叫做中輟表示式

,因為所有的運算符號都是在連個數字中間。

那麼我們也必須知道它們的規則:從左到右遍歷中輟表示式的每個數字和符號,若是數字就輸出,即成為逆波蘭表示式的一部分;若是符號,則判斷其與棧頂符號的優先順序,是右括號或者優先順序高於棧頂符號(乘除優先於加減)則棧頂元素依次出棧並輸出,並將當前符號進棧,直到最終輸出逆波蘭表示式為止。

步驟為:

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

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

3,、第三個字元是「(」,依然是符號,因其只是左括號,還沒配對,故進棧。

4、第四個字元是數字3,輸出,此時總表示式為9 3 ,接著是「-」,進棧。

5、接下來是數字1,輸出,總表示式為9 3 1 ,後面符號是「)」,此時,我們需要去匹配此前的「(」,所以棧頂依次出棧並輸出,直到「(」出棧為止。此時左括號上方只有「-」,因此輸出「-」。總表示式為9 3 1 - 。

6、緊接著是符號「*」,因為此時的棧頂符號為「+」號,優先順序低於「*」,因此不輸出,「*」進棧。接著是數字3,輸出,總的表示式為9 3 1 - 3 。

7、之後是符號「+」,此時當前的棧頂元素「*」比這個「+」的優先順序高,因此棧中元素出棧並輸出(沒有比「+」號更低的優先順序,所以全部出棧),總輸出表示式9 3 1 - 3 * + 。然後將當前這個符號「+」進棧。

8、緊接著數字10 ,輸出,總表示式為9 3 1 - 3 * + 10、後面符號「/」,所以「/」進棧。

9、最後乙個數字2,輸出,總的表示式為9 3 1 - 3 * + 10 2 。

10、因已經到了最後,所以將棧中符號全部出棧並輸出。最終輸出的逆波蘭表示式為:9 3 1 - 3 * 10 2 / + 。

經上面的推導中我們發現,想要讓計算機更具有處理我們通常的標準(中綴)表示式的能力,最重要就是兩步:

1、將中綴醉話逆波蘭表示式(棧用來進出運算的符號)

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

逆波蘭表示法

逆波蘭表示發是一種將運算子寫在運算元後面的描述程式 算式 的方法。舉個例子,我們平常用中綴表示法描述的算式 1 2 5 4 改為逆波蘭表示法之後則是1 2 5 4 相較於中綴表示法,逆波蘭表示法的優勢在於不需要括號。請輸出以逆波蘭表示法輸入的算式的計算結果。輸入在1行中輸入1個算式。相鄰的符號 運算...

逆波蘭 之樹形表示

include binarytree.h include binarytreenode.h include structure.h include optoken.h include include include using namespace std class cretree cretree ...

中綴轉字尾 逆波蘭表示

計算機無法識別數學表示式中的括號以及四則運算的先後順序,因此需要把數學表達示轉換成一種計算機能識別的,逆波蘭表示就能很好的解決這個問題。逆波蘭表示是數學表示式中的一種不需要括號的字尾表達法。即把乙個中綴數學表示式改變成乙個字尾表示。中綴表示的意思就是運算子在要計算的數字中間,而字尾表示就是運算子在要...