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

本文介绍了一种使用递归方法解析并计算逆波兰表达式的C++实现方案。通过递归调用处理运算符和操作数,文章提供了一个完整的示例程序,展示了如何根据输入的逆波兰表达式计算出其数值。

递归的作用:

1) 替代多重循环
2) 解决本来就是用递归形式定义的问题
3) 将问题分解为规模更小的子问题进行求解
....

这次我们用递归来解决递归形式的问题。


逆波兰表达式问题:

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

输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。输出为一行,即表达式的值。

 样例输入
* + 11.0 12.0 + 24.0 35.0
样例输出
1357.000000
提示:(11.0+12.0)*(24.0+35.0)


逆波兰表达式的定义的分析:
1) 一个数是一个逆波兰表达式,值为该数
2) "运算符 逆波兰表达式 逆波兰表达式" 是逆波兰表达式 ,值为两个逆波兰表达式的值运算的结果


递归解决:

#include<iostream>
#include<cstdio>                        //printf()
#include<cstdlib>                       //atof()
using namespace std;

double exp(){                           //读入一个逆波兰表达式,并计算其值
    char s[20];
    cin >> 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("%lf",exp());
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值