解题思路:
从左至右观察式子:4 + 2 - 2 * 5 - 7 / 11
1,当遇到第二个加减的时候,前一个加减可运算,
2.遇到乘除的时候直接计算出结果。
3。用STL中封装的栈结构实现。
#include<stdio.h> #include<stack> #include<string.h> #include<iostream> using namespace std; int main() { char s[250]; double a,b,su; char c; while(gets(s)&&strcmp(s,"0")!=0) { stack<double>s1; stack<char>s2; for(int i=0;s[i];i++) { if(s[i]>='0'&&s[i]<='9') { a=0; while(s[i]>='0'&&s[i]<='9')//字符转换为数 { a =a*10 + s[i]-'0'; i++; } i--; s1.push(a); } else if(s[i]=='-'||s[i]=='+') { if(!s2.empty())//第二次遇到加号或减号 { //前一个(+或—)运算可执行 a=s1.top();s1.pop(); b=s1.top();s1.pop(); c=s2.top();s2.pop(); if(c=='-')s1.push(b-a); else s1.push(b+a); } s2.push(s[i]); } else if(s[i]=='*'||s[i]=='/')//遇到乘除直接运算 { c=s[i]; i=i+2; b=0;//乘除号的右数 while(s[i]>='0'&&s[i]<='9') { b=b*10+s[i]-'0'; i++; } i--; a=s1.top();s1.pop();//乘除号的左数 if(c=='*')s1.push(a*b);//结果入栈 else s1.push(a/b); } } if(!s2.empty()) //最后最多进行一次加减运算 { c=s2.top();s2.pop(); a=s1.top();s1.pop(); b=s1.top();s1.pop(); if(c=='+')s1.push(a+b); else s1.push(b-a); } su=s1.top(); printf("%.2lf\n",su); } return 0; }
小结:
1.代码写好了,还Wrong两次,float改为double就RE了。
今后绝对无条件用 double!!!!!!!!!!!!
2.学习了一种新的输入gets(s)&&strcmp(s,"0")!=0,gets(s)以回车为输入结束('\0')。
判断时for(int i=0;s[i];i++)。字符中的‘\0’对应整数0。