额,题目是中文的,题意就不用说了= =都看懂喽。写个字符串先把这行计算式存进去,不过不能存一个算一个,因为考虑到乘除法比加减法优先的原则,如果是加号减号就先存着等待计算,如果是乘号除号就直接算出来值就好了。然后,就想到了栈的思想了,写两个栈一个存符号一个存数字,如果是加减号留在栈里,如果是乘除号就直接运算完,符号不再入栈,数字直接得出结果再存入,这样第一遍循环过后就只剩下加减法了,不过这时候还不能直接算,因为栈里再出来的话是反的= =所以再写两个栈出来,把之前的内容反过来再运算就能得到结果了。
表示一开始代码写乱了,然后乘法加法什么的混一块看的麻烦,懒得改所以又重写了一遍= =这一次写加上了注释,清楚多了,看来写注释很关键啊,至少改的时候好找位置......
下面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 ",sum); } return 0; }