九度OJ 題目1019:簡單計算器
阿新 • • 發佈:2019-02-12
- 題目描述:
- 讀入一個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
- 輸入:
- 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用一個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。
- 輸出:
- 對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。
- 樣例輸入:
-
1 + 2 4 + 2 * 5 - 7 / 11 0
- 樣例輸出:
-
3.00 13.36
- 來源:
本題思路:
先計算乘除後計算加減。將數字依次存入棧中,遇到乘號則先相乘再存入棧中,遇到除號則相除再入棧,遇到減號則將數字存成負數入棧。
最後將棧內元素相加。
由於做的時候沒注意數字和運算子間有空格,導致WA,於是強行加了一行判斷空格。。。
# include <iostream> # include <string.h> # include <stdio.h> # include <stack> # include <stdlib.h> using namespace std; int main() { char test[201],num[200],sym[4]={'*','/','+','-'}; int len; stack<double> cal; while(cin.getline(test,201)) { len = strlen(test); if(len==1&&test[0]=='0') break; int flag=2,count=-1; for(int i=0;i<len;i++) { int flag2=0;//幫助判斷是否是數字並存入num if(test[i]==' ') continue;//沒注意題目中整數和運算子用空格分隔,去掉空格。 if(test[i]>='0'&&test[i]<='9') { count++; num[count]=test[i]; flag2=1; } if(flag2==0||i==len-1) { num[count+1]='\0'; double n = atoi(num); count=-1; if(flag==0) //乘法 相乘後放入棧 { double m=cal.top(); n*=m; cal.pop(); cal.push(n); } else if(flag==1) //除法 相除後放入棧 { double m=cal.top(); n = m/n; cal.pop(); cal.push(n); } else if(flag==3) //減法 存為負數放入棧 { cal.push(-n); } else if(flag==2) //加法 直接放入棧 { cal.push(n); } for(int j =0;j<4;j++) //判斷算數符號 { if(test[i]==sym[j]) flag=j; } } } double alcount=0; while(cal.empty()!=1)//棧內剩餘數相加 { alcount+=cal.top(); cal.pop(); } printf("%.2lf\n",alcount); } return 0; } /************************************************************** Problem: 1019 Language: C++ Result: Accepted Time:0 ms Memory:1524 kb ****************************************************************/