表示式的計算

2021-09-25 01:58:03 字數 1266 閱讀 7325

1、中綴表示式:通用的算術或邏輯公式表示方法, 操作符是以中綴形式處於運算元的中間(例:3 + 4),中綴表示式是人們常用的算術表示方法;

2、字尾表示式:又稱逆波蘭式,指的是不包含括號,運算子放在兩個運算物件的後面(例:3 4 +),所有的計算按運算子出現的順序,嚴格從左向右進行(不再考慮運算子的優先規則);

3、我們一般計算表示式用的都是中綴表示式,便於人類進行計算;但計算機並不是這樣,他需要更加普遍的一種計算方法,一種不再考慮運算子優先規則的方法;

在中綴表示式中運算子有一定的優先規則①,計算機無法整體的了解到整個算式中某一運算子的的優先情況,所以我們通過將中綴表示式轉換成字尾表示式來完成計算

① 『(』的優先順序最低(為1);『+』、『-』的優先順序為2;『*』、『/』的優先順序為3;『)』的優先順序最高(為4);

1、中綴轉字尾

將中綴表示式儲存在陣列中,遍歷整個陣列

如遇到數字就直接直接放入儲存字尾表示式的陣列中;

如遇運算子,判斷運算子棧sym是否為空,

——如空直接入棧;

——如不空:判斷當前運算子是否為『)』

————如不是:則一直彈棧並放入字尾陣列中,直到棧頂元素的優先順序小於這個運算子,然後將這個運算子壓入sym棧中(注意:當前運算子無論如何都會被壓棧);

————如是:則一直彈棧並放入字尾陣列中,直到棧頂元素為『(』;

2、計算字尾表示式

遍歷整個字尾表示式陣列,

——如遇到數字,直接壓入num棧中;

——如遇到運算子,彈出num棧頂的兩個數字進行對應的四則運算,並將運算結果重新押回棧中;

最後num棧中剩下的唯一乙個數字就是表示式的值;

1、表示式計算是我一直的痛,乙個不那麼難的內容,大一上就接觸,可在下半學期又來做的時候還是出現問題,故寫出這篇部落格,希望將其記在心裡;

2、這個程式的具體實現我放在了github上 ,其中還有生成隨機合法中綴表示式的程式,有需要的同學可以參考;

3、在編寫時有乙個bug,就是沒有注意到被除數不能為0,在這卡了很長時間,望大家不會犯這樣的錯誤

4、目前程式還有一些侷限性,可以進一步優化:表示式中只能出現個位數而不能有多位數(優化:①、將字尾表示式中的每乙個元素設定為結構體或者是聯合,來儲存運算子(char型)或者是數字;②、字尾陣列中兩個不同時間放入的元素(可能是數字,也有可能是運算子)之間加乙個空格以間隔);表示式結果過大導致精度不足(優化:自己完成高精度四則運算);

表示式計算

棧的應用舉例 棧在表示式計算過程中的應用 建立運算元棧和運算子棧。運算子有優先順序。規則 自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。當遇到運算子時,如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂的連續兩個運算元進行運算,並將結果存入運算元棧,然後繼續...

表示式計算

表示式計算對於我們人來說,喜歡通過中綴表示式來計算,而計算機則不一樣,需要通過字尾表示式來計算,首先通過例項來介紹一下中綴表示式和字尾表示式 例子 中綴表示式 3 5 2 3 6 字尾表示式 3 5 2 3 6 那麼轉換規則是怎麼樣的呢?規則 從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,...

表示式計算

表示式計算 時間限制 1.0s 記憶體限制 256.0mb 問題描述 輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含乙個表示式。輸出格式 輸出這個表示式的值。樣例輸入 1 2 3 4 5 樣例輸出 4資料規模和約定 表示式長度不超過100,表示式運算...