题干:

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 

Input

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。 

Output

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。 

Sample Input

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

Sample Output

3.00
13.36

解题报告:

栈的应用,因为运算有优先级,在刚开始考虑乘法和除法,如果运算符是加法,则直接把那个数字压入栈里,如果是减法,则把那个数的相反数压入栈里,如果是乘法,则取栈头的数相乘,pop出后把结果push进去

AC代码:

#include<bits/stdc++.h>

using namespace std;
char s[205];
int main()
{
	while(1) {
		gets(s);
		if(s[0] == '0' && strlen(s) == 1) break;
		stack<double > sk;
		int tmp = 0,flag=1;
		for(int i = 0; i<strlen(s); i++) {
			if(s[i] == ' ') continue;
			else if(s[i] == '+') flag=1;
			else if(s[i] == '-') flag=2;
			else if(s[i] == '*') flag=3;
			else if(s[i] == '/') flag=4;
			else {
				tmp = 0;
				while(s[i]>='0' && s[i] <= '9') {
					tmp = tmp*10 + (s[i] - '0');i++;
				}
				i--;
				switch(flag) {
					
					case 1 : sk.push(tmp);break;
					case 2 : sk.push(-tmp);break;
					case 3 : {
						double x = sk.top() * tmp;sk.pop();
						sk.push(x);tmp=0;
						break;
					}
					case 4 : {
						double x = sk.top() / tmp;sk.pop();
						sk.push(x);tmp=0;
						break;
					}
				}
				
			}
		}
		double ans=0;
		while(!sk.empty()) {
			ans += sk.top();sk.pop();
		}
		printf("%.2f\n",ans);
	}
	
	return 0 ;
}

错误代码:

#include<bits/stdc++.h>

using namespace std;
char s[10000];
int main()
{
	while(1) {
		gets(s);
		if(s[0] == '0') break;
		stack<double > sk;
		int tmp = 0;
		for(int i = 0; i<strlen(s); i++) {
			if(s[i] == ' ') continue;
			else if(s[i] == '+') sk.push((double)tmp),tmp=0;
			else if(s[i] == '-') sk.push((double)-tmp),tmp=0;
			else if(s[i] == '*') {
				double x = sk.top() * tmp;sk.pop();
				sk.push(x);tmp=0;
			}
			else if(s[i] == '/') {
				double x = sk.top() / tmp;sk.pop();
				sk.push(x);tmp=0;
			}
			else {
				tmp = tmp*10 + (s[i] - '0');
			}
		}
		double ans=0;
		while(!sk.empty()) {
			ans += sk.top();sk.pop();
		}
		printf("%.2f\n",ans);
	}
	
	return 0 ;
}

总结:

   这个错误代码都不知道是什么一个思路,所以做这种题,每一步实现的功能需要很明确,比如我如果要读入数,那就一次性都读完,别一个一个读,会造成最后读入的一个数读不进去等问题存在!