hdu1237 表達式求值--棧
阿新 • • 發佈:2018-02-19
tput desc std sta java case double 用例 bsp
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
簡單計算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 24273 Accepted Submission(s): 8794
Input 測試輸入包含若幹測試用例,每個測試用例占一行,每行不超過200個字符,整數和運算符之間用一個空格分隔。沒有非法表達式。當一行中只有0時輸入結束,相應的結果不要輸出。
Output 對每個測試用例輸出1行,即該表達式的值,精確到小數點後2位。
Sample Output 3.00 13.36
Source 浙大計算機研究生復試上機考試-2006年
#include <iostream> #include <stack> #include <string> #include <cstdio> using namespace std; stack<double> opnd; //運算對象棧 stack<char> optr; //運算符號棧 void f() //取棧頂元素運算 { double tmp; char key=optr.top(); optr.pop(); double x=opnd.top(); opnd.pop(); double y=opnd.top(); opnd.pop(); switch(key) { case ‘+‘: tmp=x+y; break; case ‘-‘: tmp=y-x; break; case ‘*‘: tmp=x*y; break; case ‘/‘: tmp=y/x; break; } opnd.push(tmp); }int main() { double a,ans=0; char t,b; while(scanf("%lf",&a)==1) { opnd.push(a); scanf("%c",&t); if(a==0&&t==‘\n‘) //結束循環 break; while(scanf("%s %lf",&b,&a)==2) { char ch=getchar(); //讀入數字後面的字符 while(1) { if(optr.empty()||((b==‘*‘||b==‘/‘)&&(optr.top()==‘+‘||optr.top()==‘-‘))) { optr.push(b); //棧空或下一個運算符優先級更高,入棧 opnd.push(a); break; } else //否則取棧頂元素運算然後運算符入棧 f(); } if(ch==‘\n‘) //輸出結果 { while(!optr.empty()) { f(); } ans=opnd.top(); printf("%.2lf\n",ans); while(!opnd.empty()) //多組測試數據,清空棧 { opnd.pop(); } while(!optr.empty()) { optr.pop(); } break; } } } return 0; }
這題至少整了兩天,一開始是為了練一練STL,熟悉熟悉應用的,然後發現數據結構教科書上P87的例題寫錯了,只能進行10以內的加減乘除運算,除法還沒法保持精度,然後這題一開始敲的時候就是整體將表達式讀入,再處理的,沒有註意到題中的每個符號之間都有一個空格,這能很好的簡化題目,否則就得考慮字符串轉化為數字的處理,手動模擬數字乘位權值;(這裏,題目也沒給清楚表達式裏數字的範圍,= =有想到java的大數浮點型)。最後終於AC了。。。
hdu1237 表達式求值--棧