額,題目是中文的,題意就不用說了= =都看懂喽。寫個字符串先把這行計算式存進去,不過不能存一個算一個,因為考慮到乘除法比加減法優先的原則,如果是加號減號就先存著等待計算,如果是乘號除號就直接算出來值就好了。然後,就想到了棧的思想了,寫兩個棧一個存符號一個存數字,如果是加減號留在棧裡,如果是乘除號就直接運算完,符號不再入棧,數字直接得出結果再存入,這樣第一遍循環過後就只剩下加減法了,不過這時候還不能直接算,因為棧裡再出來的話是反的= =所以再寫兩個棧出來,把之前的內容反過來再運算就能得到結果了。
表示一開始代碼寫亂了,然後乘法加法什麼的混一塊看的麻煩,懶得改所以又重寫了一遍= =這一次寫加上了注釋,清楚多了,看來寫注釋很關鍵啊,至少改的時候好找位置......
下面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;
}