額,題目是中文的,題意就不用說了= =都看懂喽。寫個字符串先把這行計算式存進去,不過不能存一個算一個,因為考慮到乘除法比加減法優先的原則,如果是加號減號就先存著等待計算,如果是乘號除號就直接算出來值就好了。然後,就想到了棧的思想了,寫兩個棧一個存符號一個存數字,如果是加減號留在棧裡,如果是乘除號就直接運算完,符號不再入棧,數字直接得出結果再存入,這樣第一遍循環過後就只剩下加減法了,不過這時候還不能直接算,因為棧裡再出來的話是反的= =所以再寫兩個棧出來,把之前的內容反過來再運算就能得到結果了。
表示一開始代碼寫亂了,然後乘法加法什麼的混一塊看的麻煩,懶得改所以又重寫了一遍= =這一次寫加上了注釋,清楚多了,看來寫注釋很關鍵啊,至少改的時候好找位置......
下面AC代碼
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<stack> using namespace std; char s[205]; stack<double>ds; stack<char>mj; stack<double>zs; stack<char>hj; int main() { int len; int i,j; int sig; double a,b; double sum; char c; while(1) { gets(s); if(strcmp(s,"0")==0) break; len=strlen(s); for(i=0;i<len;i++) { if(s[i]==' ') continue; //如果是加減法的話,先放進去,等著 else if(s[i]=='+'||s[i]=='-') { mj.push(s[i]); } //如果是乘除法的話,拉出前一個數進行計算 else if(s[i]=='*'||s[i]=='/') { if(s[i]=='*') sig=3; else sig=4; a=ds.top(); ds.pop(); b=0; for(i=i+2;i<len;i++) { if(s[i]==' ') break; b=b*10+(s[i]-'0'); } if(sig==3) { a=a*b; ds.push(a); } else { a=a/b; ds.push(a); } } else if(s[i]>='0'&&s[i]<='9') { a=0; for(;i<len;i++) { if(s[i]==' ') break; a=a*10+(s[i]-'0'); } ds.push(a); } } //如果還有沒進行計算的數,進行一下計算 while(!ds.empty()) { a=ds.top(); ds.pop(); zs.push(a); } while(!mj.empty()) { c=mj.top(); mj.pop(); hj.push(c); } sum=zs.top(); zs.pop(); while(!hj.empty()) { c=hj.top(); hj.pop(); a=zs.top(); zs.pop(); if(c=='+') sum=sum+a; else sum=sum-a; } printf("%.2f\n",sum); } return 0; }