一、問題重述
【問題描述】
從標準輸入中讀入乙個整數算術運算表示式,如5 - 1 * 2 * 3 + 12 / 2 / 2 = 。計算表示式結果,並輸出。
要求:1、表示式運算子只有+、-、*、/,表示式末尾的』=』字元表示表示式輸入結束,表示式中可能會出現空格;
2、表示式中不含圓括號,不會出現錯誤的表示式;
3、出現除號/時,以整數相除進行運算,結果仍為整數,例如:5/3結果應為1。
【輸入形式】
在控制台中輸入乙個以』=』結尾的整數算術運算表示式。
【輸出形式】
向控制台輸出計算結果(為整數)。
【樣例1輸入】
5 - 1 * 2 * 3 + 12 / 2 / 2 =
【樣例1輸出】
【樣例2輸入】
500 =
【樣例2輸出】
【樣例1說明】
輸入的表示式為5 - 1 * 2 * 3 + 12 / 2 / 2 =,按照整數運算規則,計算結果為2,故輸出2。
【樣例2說明】
輸入的表示式為500 = ,沒有運算子參與運算,故直接輸出500。
【評分標準】
該題要求輸出整數表示式的計算結果,共有5個測試點。上傳c語言檔名為example1c.c。
二、演算法概述
這裡提供乙個我的老師提過的乙個演算法,概括來說就是:從左向右依次運算,遇到乘除就先算乘除。下面用乙個例子來解釋:
5 - 1 * 2 * 3 + 12 / 2 / 2 =
1.該等式等價於0+5 - 1 * 2 * 3 + 12 / 2 / 2 = ,所以我們先設a1=0 , op1=+
2.讀取資料a2=5 , op2=-
3.a1=a1+a2=5 , op1=op2=-,讀取a2=1 , op2=*
4.因為op2是*,所以我們繼續讀取後面的資料把它計算完,a3=2 , op3=*
5.計算a2=a2*a3,並令op2=op3,繼續如此計算直到計算完乘、除
6.計算完第乙個連乘,此時a1=5,op1=-,a2=6,op2=+
7.計算op1所在的運算,a1=-1,op1=+
8.後面的操作類似,就不多說了
這個演算法的關鍵技巧,我認為是每次讀取乙個數字和乙個運算子。
三、c語言實現
#include #include #include #include int main()
//將兩項相加(減)
if(op1=='+')
a1 += a2;
else if(op1=='-')
a1 -= a2;
op1 = op2; //此處注意
}printf("%d",a1);
return 0;
}
四、思路拓展
關於運算的順序還可以用棧來維護,通過建立運算子優先順序表來決定入棧和出棧順序,從而控制運算順序。同學們可以嘗試一下,如果允許括號運算該如何處理?如何把中綴表示式改為字首或字尾的?
棧 四則運算表示式實現
棧的乙個常見應用,四則運算表示式求值。主要有兩個步驟 1,中綴轉字尾 2,字尾求值 實現起來比較簡單,我通過c 的容器stack實現一遍。從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即稱為字尾表示式的一部分,若是符號,則判斷其與棧頂符號的優先順序,是右括號或優先順序低於棧頂符號 乘除優先...
四則運算表示式求值
03 四則運算表示式求值 輸入輸入為四則運算表示式,僅由陣列 四則運算符 左右括號組成,不含空格。假設運算子結果都是整數。輸出輸出這個表示式的值 分析首先我們要搞清楚表示式的定義是什麼 表示式 由乙個或者多個項組成,多個項的表示式由 連線 項 由乙個或者多個因子組成,多個因子由 連線 因子 由 表示...
四則運算表示式求值
表示式求值是關於棧的應用,涉及到中綴與字尾式的轉換,本文關於10以內不帶括號的四則運算。9 3 4 x 3 24 1 x 9 5 9 9 5 x 9 4 6 2 x 3 1 42 思路 遇到數字直接入數字棧。遇到運算子,第乙個運算子直接入符號棧,後面的需要與符號棧棧頂元素比較優先順序。若當前優先順序...