算法学习2.2递归之逆波兰表达式

例题:逆波兰表达式

用递归解决递归形式的问题

题目

逆波兰表达式是一种把运算符前置的算术表达式(其实一般教科书上称这种表达式为波兰表达式) ,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。
逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,
例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。
本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。

输入

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

输出

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

本题中“逆波兰表达式”的定义:

  1. 一个数是一个逆波兰表达式,值为该数
  2. “运算符 逆波兰表达式 逆波兰表达式” 是逆波兰表达式 ,值为两个逆波兰表达式的值运算的结果

代码理解

问题:以* + 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;
 }
发布了20 篇原创文章 · 获赞 1 · 访问量 160

猜你喜欢

转载自blog.csdn.net/weixin_42503072/article/details/104392661