1.讀入一個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
2.input測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用一個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。
3.output對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。
這道題的難處在於如何判斷運算的先後順序,仔細思考下我們就知道可以利用stack來儲存我們需要的數字,而運算子僅作判斷使用。
我們又知道——我們輸入的時候先 數字 再 運算子;故可用兩個while()進行輸入;(因為一開始的輸入規則和後面的規則有所區別)
講一下這道提題的難點。
1.輸入格式的把握;
兩個while(),先輸入數字 cin >> n; 在輸入運算子 c=getchar();
或利用string s; 這就需要多個if()來判斷哪些應該是整數並將其轉化為數值;(較為複雜,但在第二種方法中使用);
2.運算子的先後;
建一個stackarray; 先壓數字 ,根據前一個的運算子判斷——如果是“*”或 “/”則把即將壓棧的數值和棧的頂值相乘,再壓棧;
或兩個棧,一個數值棧,一個運算子棧,寫一個函式compare()比較運算子大小——然後可以直接寫運算的方法,不再考慮運算先後;再一個壓棧的方法(邊壓棧,邊計算結果);
#include #include#include
#include
#include
using
namespace
std;
stack
num;
intmain()
if(c=='/'
)
if(c=='+'
)
if(c=='-'
)
if(getchar()=='\n'
)
break
; c =getchar();
}double sum = 0
;
while(!num.empty())
printf(
"%0.2lf\n
",sum);
}return0;
}
有所鑑借;