POJ——2694逆波兰表达式

问题描述:

逆波兰表达式是一种吧运算符前置的算术表达式,例如普通的表达式2+3的逆波兰表示为+23.逆波兰表达式的优点是运算符之间不必有优先级的关系,也不必有括号改变运算次序,例如(2+3)*4的逆波兰表示法为*+2 3 4.本题求解的逆波兰表达式的值。

 

输入数据:

输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。

输出要求:

输出为一行,即表达式的值。

输入样例:

* + 11.0 12.0 +24.0 35.0+

输出样例:

1357.000000

解题思路:

这个问题看上去有些复杂,如果只是简单地模拟计算步骤不太容易想清楚,但是如果用递归的思想就非常容易想清楚。这里根据逆波兰表达式的定义进行递归求解。在递归函数中,针对当前的输入有5种情况:1。输入是常数,则表达式的值就是这个常数;2.输入的是‘+’,则表达式的值是再继续读入两个表达式并计算出他们的值,然后将他们的值进行相加;3.输入‘-’;4.输入是‘*’;5.输入是‘/’;后三种情况与2.相同,只是计算从‘+’变成‘-’,‘*’,‘/’。

 1 参考程序:
 2 #include<stdio.h>
 3 #include<math.h>
 4 double exp(){
 5     char a[10];
 6     scanf("%s",a);
 7     switch(a[0]){
 8     case'+':return exp()+exp();
 9     case'-':return exp()-exp();
10     case'*':return exp()*exp();
11     case'/':return exp()/exp();
12     default:return atof(a);
13     }
14 }
15 void main()
16 {
17     double ans;
18     ans=exp();
19     printf("%f\n",ans);
20 }
posted @ 2012-08-17 22:38  blue——  阅读(3205)  评论(1编辑  收藏  举报