1. 程式人生 > >hdu1237 表達式求值--棧

hdu1237 表達式求值--棧

tput desc std sta java case double 用例 bsp

簡單計算器

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 24273 Accepted Submission(s): 8794


Problem Description 讀入一個只包含 +, -, *, / 的非負整數計算表達式,計算該表達式的值。

Input 測試輸入包含若幹測試用例,每個測試用例占一行,每行不超過200個字符,整數和運算符之間用一個空格分隔。沒有非法表達式。當一行中只有0時輸入結束,相應的結果不要輸出。

Output 對每個測試用例輸出1行,即該表達式的值,精確到小數點後2位。

Sample Input 1 + 2 4 + 2 * 5 - 7 / 11 0

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 表達式求值--棧