【题目描述】
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
【输入】
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
【输出】
输出为一行,表达式的值。
可直接用printf("%f ", v)输出表达式的值v。
【输入样例】
* + 11.0 12.0 + 24.0 35.0
【输出样例】
1357.000000
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
char a[101];
double ni()
{
scanf("%s",a);
if(a[0]=='+')
return ni()+ni();
if(a[0]=='-')
return ni()-ni();
if(a[0]=='*')
return ni()*ni();
if(a[0]=='/')
return ni()/ni();
else
return atof(a);
}
int main()
{
printf("%f
",ni());
return 0;
}
代码非常短,我写这个题主要是因为思路非常巧妙。不再细致到每一句注释,直接捋思路。这个代码的思路大致就是,
如果你输入的是一个运算符,那么就要再输入两个数来完成一次运算,这个巧妙的递归就是用了这个原理,如果你输入
一个运算符,那么就要再输入两次。如果还是运算符,那么继续递归。知道把所有的运算符都“消耗完”,那么就根据
各自的运算符进行加减乘除。打个比方,一个运算符是一个根,一个数字就是一片叶子。叶子底下不能结叶子和根,
当它成为一片叶子也就是一个数字时,就停止递归。反之,根可以一直生根,除非长出叶子。