- 题目描述:
- 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
- 输入:
- 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
- 输出:
- 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
- 样例输入:
-
1 + 24 + 2 * 5 - 7 / 110
- 样例输出:
-
3.0013.36
-
解题思路:这道题因为是没有括号的,因而建立一个栈,若遇到加号把数字入栈,若遇到减号则转换为负数后入栈,若遇到乘除则就近直接计算后再把数值写回栈尾。最后再将栈内数字全部相加得到最后的结果。
不得不说这样做非常巧妙,不用像传统的做法那样创建一个栈保存运算符,比起王道书上的标准答案代码量也小了很多
1 #include2 #include 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; //注意每次都要置018 ret = 0; //注意每次都要置019 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 }