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,表示式運算...