7-21 求前缀表达式的值(25 分)

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式:

输入在一行内给出不超过30个字符的前缀表达式,只包含+-*\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式:

输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR

输入样例:

+ + 2 * 3 - 7 4 / 8 4

输出样例:

13.0
 个人感觉这道题有一些些难吧,最后是参考一个C++的程序写出来的,很巧妙!!
 这里面atof(),是C 语言标准库中的一个字符串处理函数,功能是把字符串转换成浮点数,所使用的头文件为<stdlib.h>。
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 double exp();
 5 
 6 int main()
 7 {
 8     printf("%.1f",exp());
 9     return 0;
10 }
11 
12 double exp()
13 {
14     char a[10];  //存储第一个非空格字符
15     scanf("%s",a);
16 
17     if( !a[1])
18     {
19         //a[1]为空只有一位
20         switch( a[0])
21         {
22         case '+' :
23             return exp()+exp();
24         case '-' :
25             return exp()-exp();
26         case '*' :
27             return exp()*exp();
28         case '/' :
29         {
30             double fenzi = exp();
31             double fenmu = exp();
32             if(fenmu !=0) return fenzi/fenmu;
33             else
34             {
35                 printf("ERROR");  //分母为0
36                 exit(0);   //程序结束
37             }
38         }
39         default :
40             return atof(a);   //字符串转换为浮点数
41         }
42     }
43     else
44     {
45         
46         if( a[0]=='-' || a[0]=='+')
47         {
48             char flag = a[0];  //记录符号
49             int i =0 ;
50             while(a[i])
51             {
52                 a[i] = a[i+1];
53                 i++;
54             }
55             if(flag=='-')
56                 return 0-atof(a);
57             else return atof(a);
58         }
59         else return atof(a);
60     }
61 }

 

posted @ 2018-02-01 19:09  yuxiaoba  阅读(1650)  评论(0编辑  收藏  举报