利用棧解析算術表示式

2021-07-05 15:22:42 字數 1863 閱讀 5043

在沒有接觸到棧這種資料結構時,一直覺得用程式計算四則表示式是件相當繁瑣的事。但利用棧,問題就立刻變得容易許多。

解析任何包括 + , - , * , / , () 和0到9數字組成的算術表示式,並計算其結果。

中綴表示式就是通常所說的算術表示式,比如(1+2)*3-4。

字尾表示式是指通過解析後,運算子在運算數之後的表示式,比如上式解析成字尾表示式就是12+3*4-。這種表示式可以直接利用棧來求解。

優先順序運算子

1括號 ()

2負號 -

3乘方 **

4乘 *,除 /,求餘 %

5加 +,減 -

6小於<,小於等於<=,大於》,大於等於》=

7等於==,不等於!=

8邏輯與

9邏輯或

即:一元運算子 > 二元運算子 > 多元運算子

從左向右依次取得資料a

如果 a 是數字,直接輸出

如果 a 是運算子(含左右括號),則:

如果表示式已經讀取完成,而棧中還有運算子時,依次由頂端輸出

如果我們有表示式 (a-b)*c+d-e/f,要翻譯成字尾表示式,並且把字尾表示式儲存在乙個名叫output的字串中,可以用下面的步驟。

讀取』(『,壓入堆疊,output為空

讀取a,是運算數,直接輸出到output字串,output = a

讀取』-『,此時棧裡面只有乙個』(『,因此將』-『壓入棧,output = a

讀取b,是運算數,直接輸出到output字串,output = ab

讀取』)』,這時候依次輸出棧裡面的運算子』-『,然後就是』(『,直接彈出,output = ab-

讀取』*』,是運算子,由於此時棧為空,因此直接壓入棧,output = ab-

讀取c,是運算數,直接輸出到output字串,output = ab-c

讀取』+』,是運算子,它的優先順序比』『低,那麼彈出』『,壓入』+」,output = ab-c*

讀取d,是運算數,直接輸出到output字串,output = ab-c*d

讀取』-『,是運算子,和』+』的優先順序一樣,因此彈出』+』,然後壓入』-『,output = ab-c*d+

讀取e,是運算數,直接輸出到output字串,output = ab-c*d+e

讀取』/』,是運算子,比』-『的優先順序高,因此壓入棧,output = ab-c*d+e

讀取f,是運算數,直接輸出到output字串,output = ab-c*d+ef

原始字串已經讀取完畢,將棧裡面剩餘的運算子依次彈出,output = ab-c*d+ef/-

當有了字尾表示式以後,運算表示式的值就非常容易了。可以按照下面的流程來計算。

從左向右掃瞄表示式,乙個取出乙個資料data

如果 data 是運算元,就壓入堆疊

如果 data 是操作符,就從堆疊中彈出此操作符需要用到的資料的個數,進行運算,然後把結果壓入堆疊

如果資料處理完畢,堆疊中最後剩餘的資料就是最終結果

比如我們要處理乙個字尾表示式1234+*+65/-,那麼具體的步驟如下:

首先1,2,3,4都是運算元,將它們都壓入棧

取得』+』,為運算子,彈出資料3,4,得到結果7,然後將7壓入棧

取得』*』,為運算子,彈出資料7,2,得到資料14,然後將14壓入棧

取得』+』,為運算子,彈出資料14,1,得到結果15,然後將15壓入棧

6,5都是資料,都壓入棧

取得』/』,為運算子,彈出資料6,5,得到結果1.2,然後將1.2壓入棧

取得』-『,為運算子,彈出資料15,1.2,得到資料13.8,這就是最後的運算結果

大部分參考自 chenpeggy 的利用堆疊解析算術表示式,收穫頗豐,故有此文。

棧 算術表示式

將乙個算術表示式 即中綴形式 轉化成其字尾形式,並算出答案。include include include include include include using namespace std using namespace std bool isoperator char ch return f...

解析算術表示式

現有字串形式的算術表示式,求計算其值。string str1 2000 600 3 300 2 string str2 2000 600.389895334 2 300 2 6 100 求解方法如下 讀取公式,返回結果。param express 算術公式 return 結果字串 保留兩位小數 pu...

棧的應用 解析算術表示式

對計算機的演算法來說,直接求算術表示式的值是相當困難的,一般分兩步實現演算法會更容易 將算術表示式轉換成另一種形式。計算字尾表示式的值。第一步比較難,但第二步很簡單。對計算機來說,這種分兩步的演算法比直接解析演算法容易的多。中綴表示式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處於運算元的中...