算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如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 }