例题:逆波兰表达式
用递归解决递归形式的问题
题目
逆波兰表达式是一种把运算符前置的算术表达式(其实一般教科书上称这种表达式为波兰表达式) ,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。
逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,
例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。
本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
输入
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数
输出
输出为一行,表达式的值。
本题中“逆波兰表达式”的定义:
- 一个数是一个逆波兰表达式,值为该数
- “运算符 逆波兰表达式 逆波兰表达式” 是逆波兰表达式 ,值为两个逆波兰表达式的值运算的结果
代码理解
问题:以* + 11.0 12.0 + 24.0 35.0为例,第一次执行exp(),我们输入了字符串,然后switch(s[0]),碰到了乘号,返回exp()*exp(),如果以普通的函数调用来看这两个式子的任意一个,我认为都会重新执行cin>>s这个命令,而实际情况是自动跳过了第一个星号,执行了后面的语句,这让我感到疑惑。
我的理解来说每次执行exp()他都会往下继续读,因为输入以空格隔开,每次读到空格停止,每次执行exp()都执行cin >> s 读取一个字符
代码块
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
double exp()
{
char s[20];//假设这个式子的长度小于20。定义个字符数组每次只读入一个空格前的字符。
cin >> s;//每次递归都重新更新s[]中的内容
switch(s[0])
{
case '+' : return exp() + exp();
case '-' : return exp() - exp();
case '*' : return exp() * exp();
case '/' : return exp() / exp();
default :
return atof(s);
break;
}
}
int main()
{
printf("%f",exp());
return 0;
}