递归算法实例应用(二)

简介: 递归算法实例应用(二):Polish Expression问题

Polish Expression

Description

A Polish expression is an arithmetic expression that prepositions an operator. For example, the Polish representation of the ordinary expression 2 + 3 is + 2 3. The advantage of Polish expressions is that there is no need for precedence between operators, nor for parentheses to change the order of operations. For example, the Polish representation of (2 + 3) * 4 is * + 2 3 4. This problem evaluates the value of the Polish expression, where the operators include ‘+’,‘-’,‘*’,‘/’.

Input

The input is a line with Spaces separating both the operator and the operand, which is a floating-point number.

Output

The output is a line, the value of the expression.

Sample Input

* + 11.0 12.0 + 24.0 35.0

Sample Output

1357.000000

关于前缀表达式,又称波兰表达式,它是一种不需要括号的计算表达式的表示法。它将操作符号写在操作数之前,即二元运算符总是置于与之相关的两个运算对象之前,而每一个对象也可以是一个波兰表达式,因此波兰式是一个明显的以递归形式定义的问题。所以我们可以采用递归的方式进行解决。

同时,在数据结构栈相关章节,也有更为详细的阐述,主要是通过栈的方法将我们所熟知的中缀表达式转为后缀表达式(逆波兰表达式)或前缀表达式(波兰表达式),因为在计算机中通过前缀、后缀表达式相比于中缀表达式有着更广、更深的用途,只需入栈和出栈就可以搞定任何普通中缀表达式的运算。简言之为:如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。具体通过栈来模拟算法转换在此不加阐述,本文属递归篇,所以通过递归形式来解决问题。


算法思想:

当仅通过递归来实现时,相比于栈操作问题会变得更加简单。

所以,我们从波兰式的定义出发:

  1. 一个数是一个波兰表达式,值为数本身。
  2. “运算符” “波兰表达式1” “波兰表达式2” 是一个波兰表达式,值为波兰表达式1 运算符 波兰表达式2的值。

发现该定义本身是一个以递归形式来定义的,如2中,在定义波兰式时又用到了波兰式的概念,所以波兰式是一个以递归形式定义的问题。

而在1中,该条定义是明确的一条定义,并没有递归的定义形式出现。

波兰式的递归形式之所以成立,是因为1中这条非递归形式的定义在约束,作为递归的终止条件。也就是说,因为1中定义的存在使得2中的定义不存在无限循环定义的形式,使得波兰式的递归形式成立。

当对于波兰式的递归定义形式清楚以后问题就迎刃而解。

由于C/C++语言具有输入/输出缓冲区的特性,所以可以在程序等待输入时一次性将待输入字符串输入完整。


代码逻辑:

  1. 依次读入每一个字符串
  2. 判断字符串类型:

    • 若该字符串为‘+’,则后两个字符串应该为波兰式1和波兰式2,并对两波兰式做加法运算,其值作为返回值。
    • 若该字符串为‘-’,则后两个字符串应该为波兰式1和波兰式2,并对两波兰式做减法运算,其值作为返回值。
    • 若该字符串为‘*’,则后两个字符串应该为波兰式1和波兰式2,并对两波兰式做乘法运算,其值作为返回值。
    • 若该字符串为‘/’,则后两个字符串应该为波兰式1和波兰式2,并对两波兰式做除法运算,其值作为返回值。
    • 若该字符串为数字,则根据定义1可知,改波兰式的值为该值本身,所以返回该字符串对应的双浮点数类型即可,可通过stdlib.h头文件中atof()函数进行转换。
  3. 输出波兰式的值

代码整合:

double PolishExp() {
    char str[20];
    scanf("%s", str);
    switch (str[0]) {
        case '+':
            return PolishExp() + PolishExp(); // +ab -> a+b
        case '-':
            return PolishExp() - PolishExp(); // -ab -> a-b
        case '*':
            return PolishExp() * PolishExp(); // *ab -> a*b
        case '/':
            return PolishExp() / PolishExp(); // /ab -> a/b
        default:
            return atof(str); //将字符串转为双浮点数类型
    }
}

By Ss1Two 2023/01/14

目录
相关文章
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
54 3
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的优化算法及其应用
【10月更文挑战第8天】 本文将探讨深度学习中常用的优化算法,包括梯度下降法、Adam和RMSProp等,介绍这些算法的基本原理与应用场景。通过实例分析,帮助读者更好地理解和应用这些优化算法,提高深度学习模型的训练效率与性能。
193 63
|
21天前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法与应用
探索人工智能中的强化学习:原理、算法与应用
|
20天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
39 1
|
20天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
49 1
|
1月前
|
缓存 算法 网络协议
OSPF的路由计算算法:原理与应用
OSPF的路由计算算法:原理与应用
42 4
|
27天前
|
机器学习/深度学习 监控 算法
基于反光衣和检测算法的应用探索
本文探讨了利用机器学习和计算机视觉技术进行反光衣检测的方法,涵盖图像预处理、目标检测与分类、特征提取等关键技术。通过YOLOv5等模型的训练与优化,展示了实现高效反光衣识别的完整流程,旨在提升智能检测系统的性能,应用于交通安全、工地监控等领域。
|
1月前
|
存储 算法 网络协议
OSPF的SPF算法介绍:原理、实现与应用
OSPF的SPF算法介绍:原理、实现与应用
76 3
|
1月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
40 0
|
21天前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法及应用
探索人工智能中的强化学习:原理、算法及应用
下一篇
DataWorks