給出乙個表示式,其中運算子僅包含+,-,*,/,^要求求出表示式的最終值,資料可能會出現括號情況,還有可能出現多餘括號情況資料保證不會出現》maxlongint的資料,資料可能會出現負數情況
僅一行,即為表示式
僅一行,既為表示式算出的結果
(2+2)^(1+1)
16
表示式總長度<=30
轉變為:將乙個中序表示式轉化成為字尾表示式方法
首先維護的是兩個棧,我們這裡暫且稱為s1和
s2,s1中的結果最後存的就是逆波蘭表示式,
s2中將用於暫時存放運算子並且在最終形成逆波蘭表示式的時候,該棧是會清空的。下面我們看看怎樣具體的形成逆波蘭表示式。
在此首先定義一下運算子的優先順序關係,從小到達排序,相同優先順序沒有用逗號隔開:(,+-,
*\,負號,)。
從左至右遍歷乙個給定的中序表示式,也就是我們常規的數學計算的表示式。(1
)如果遇到的是數字,我們直接加入到棧
s1中;(2
)如果遇到的是左括號,則直接將該左括號加入到棧
s2中;(3
)如果遇到的是右括號,那麼將棧
s2中的運算子一次出棧加入到棧
s1中,直到遇到左括號,但是該左括號出棧
s2並不加入到棧
s1中;(4
)如果遇到的是運算子,包括單目運算子和雙目運算子,我們按照下面的規則進行操作:
(4-1
)如果此時棧
s2為空,則直接將運算子加入到棧
s2中;
(4-2
)如果此時棧
s2不為空,當前遍歷的運算子的優先順序大於(等於
,等於刪掉
)棧頂運算子的優先順序,那麼直接入棧s2;
(4-3
)如果此時棧
s2不為空,當前遍歷的運算子的優先順序小於
(增加等於
)棧頂運算子的優先順序,則將棧頂運算子一直出棧加入到棧
s1中,直到棧為空或者遇到乙個運算子的優先順序小於等於當前遍歷的運算子的優先順序,此時將該運算子加入到棧
s2中;(5
)直到遍歷完整個中序表示式之後,棧
s2中仍然存在運算子,那麼將這些運算子依次出棧加入到棧
s1中,直到棧為空。
按照上面的五條操作反覆進行完成,那麼棧
s1中存放的就是逆波蘭表示式。
為了解釋字尾表示式的好處,我們先來看看,計算機如何應用
字尾表示式
計算出最終的結果
20的。
字尾表示式:
9 3 1-3*+ 10 2/+
·
規則:從左到右遍歷表示式的每個數字和符號,遇到是數字就進棧,遇到是符號,就將處於棧頂兩個數字出棧,進行運算,運算結果進棧,一直到最終獲得結果。
下面是詳細的步驟:
1. 初始化乙個空
棧。此桟用來對要運算的數字進出使用。
2. 字尾表示式中前三個都是數字,所以9、
3、1進棧。
3. 接下來是減號
「-」,所以將棧中的
1出棧作為減數,
3出棧作為被減數,並運算
3-1得到
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
出棧,棧變為空。
表示式計算4(棧)
題目描述 給出乙個表示式,其中運算子僅包含 加 減 乘 整除 乘方 要求求出表示式的最終值 資料可能會出現括號情況,還有可能出現多餘括號情況 資料保證不會出現 geq 2 的答案資料保證不會出現 2 31的答案 資料可能會出現負數情況 輸入描述 僅一行,即為表示式 輸出描述 僅一行,既為表示式算出的...
表示式計算
棧的應用舉例 棧在表示式計算過程中的應用 建立運算元棧和運算子棧。運算子有優先順序。規則 自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。當遇到運算子時,如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂的連續兩個運算元進行運算,並將結果存入運算元棧,然後繼續...
表示式計算
表示式計算對於我們人來說,喜歡通過中綴表示式來計算,而計算機則不一樣,需要通過字尾表示式來計算,首先通過例項來介紹一下中綴表示式和字尾表示式 例子 中綴表示式 3 5 2 3 6 字尾表示式 3 5 2 3 6 那麼轉換規則是怎麼樣的呢?規則 從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,...