问题描述
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3 的逆波
兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号
改变运算次序,例如(2 + 3) * 4 的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,
其中运算符包括 + - * / 四个。
输入数据
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数
输出要求
输出为一行,表达式的值。
输入样例
* + 11.0 12.0 + 24.0 35.0
输出样例
1357.000000
一看到逆波兰式,首先想到的是用栈的方式来解决。的确能解决,但是一个栈怎么写了?基本结构是什么?忘了。。。温习下
typedef struct { Elem *base; Elem *top; int stackSize; }stack;
当然,肯定不是用栈来解决啦。我们用递归。栈的一个重要的程序设计的实现就是递归。
递归的思想,把原始问题划分成更小的,相同的问题来解决。很明显,这个逆波兰式是可以的。当时具体怎么输入呢?难倒我了,纠结得想不出来。最后还是看了解题思路才想出来的。要用到atof()函数,好吧。。。再加个switch,就那么简答!
#include <stdio.h> #include <stdlib.h> FILE *fp; double RPN() { char str[5]; fscanf(fp,"%s",str); switch(str[0]) { case '+': return RPN() + RPN(); break; case '-': return RPN() - RPN(); break; case '*': return RPN() * RPN(); break; case '/': return RPN() / RPN(); break; default: return atof(str); break; } } int main() { double dResult; fp = fopen("in.txt","r"); dResult = RPN(); printf("%f\n",dResult); return 0; }
2013/5/6 21:18