- 题目描述:
-
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
- 输入:
-
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
- 输出:
-
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
- 样例输入:
-
1 + 2 4 + 2 * 5 - 7 / 11 0
- 样例输出:
-
3.00 13.36
-
解题思路:这道题因为是没有括号的,因而建立一个栈,若遇到加号把数字入栈,若遇到减号则转换为负数后入栈,若遇到乘除则就近直接计算后再把数值写回栈尾。最后再将栈内数字全部相加得到最后的结果。
不得不说这样做非常巧妙,不用像传统的做法那样创建一个栈保存运算符,比起王道书上的标准答案代码量也小了很多
1 #include <stdio.h> 2 #include<stdlib.h> 3 4 double ans[1002]; 5 int tail; //尾数下标 6 7 int main() 8 { 9 int temp1,temp2; 10 int i; 11 char c1,c2; 12 double ret; 13 14 while( scanf("%d%c",&temp1,&c2)!=EOF ) 15 { 16 if( temp1==0 && c2==‘\n‘) break; //如果输入只有0时结束 17 tail = 0; //注意每次都要置0 18 ret = 0; //注意每次都要置0 19 ans[++tail] = 1.0*temp1; //转换为浮点数 20 while(scanf("%c %d%c",&c1,&temp2,&c2)!=EOF) 21 { 22 if( c1==‘+‘) 23 { 24 ans[++tail] = 1.0*temp2; //如果是加号直接入栈 25 } 26 else if( c1==‘-‘) 27 { 28 ans[++tail] = -1.0*temp2; //如果是负号转换为负数再入栈 29 } 30 else if( c1==‘*‘) 31 { 32 ans[tail] *= temp2; //如果是乘号则更新栈尾数 33 34 } 35 else if( c1==‘/‘&&temp2!=0) 36 { 37 ans[tail] /= temp2; //如果是除号则更新栈尾数 38 } 39 else break; 40 if( c2!=‘ ‘) break; //如果最后一个字符不是空格则输入结束 41 } 42 for( i=1; i<=tail; i++) 43 { 44 ret += ans[i]; //把栈里头的东西全部加起来,求和 45 } 46 printf("%.2lf\n",ret); 47 } 48 49 return 0; 50 }