递归--逆波兰表达式

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

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

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

简单来说,这种表达式就是运算符号在全部在前面,需要运算的数值在后面,好像这种叫法是后缀表达式。
运算的原理是:从左往右走,如果某个运算符后面是连着2个数字的,那么计算其结果,然后再把其结果放在运算符的位置,参与运算的数移除,后面剩余的数字再往左移,依次类推,完成整个表达式的计算。

用递归解决递归形式的问题
样例输入
* + 11.0 12.0 + 24.0 35.0
样例输出
1357.000000
提示:(11.0+12.0)*(24.0+35.0)

python思想用了2种办法,第一种是利用栈的思想,一种是递归的思想。

"""
第一种解法,list列表从后往前读入数据
当数据是数字则加入栈,如果是运算符,则取出栈顶的前2个数字进行计算
然后再把计算结果存入栈顶,
后续依次规则进行,最后求出结果

def Exp(list):
    stackList = []
    for i in reversed(list):
        if (i == "+"):
           num = len(stackList)
           newValue = float(stackList[num-1]) + float(stackList[num-2])
           stackList.pop()
           stackList.pop()
           stackList.append(newValue)
        elif (i == "-"):
            num = len(stackList)
            newValue = float(stackList[num - 2]) - float(stackList[num - 1])
            stackList.pop()
            stackList.pop()
            stackList.append(newValue)
        elif (i == "*"):
            num = len(stackList)
            newValue = float(stackList[num-1]) * float(stackList[num-2])
            stackList.pop()
            stackList.pop()
            stackList.append(newValue)
        elif (i == "/"):
            num = len(stackList)
            newValue = float(stackList[num - 2]) / float(stackList[num - 1])
            del stackList[-1]
            del stackList[-1]
            stackList.append(newValue)
        else:
            stackList.append(i)
    print(stackList[0])

def main():
    print("请输入需要求解的波兰表达式(前缀):",end="")
    calculateList = []
    calculateList = input().strip().split(" ")
    Exp(calculateList)
"""
#第二种解法:利用函数递归调用实现

calculateList = []
#逐位遍历list列表,每次读入1个字符
pos = -1
def Exp():
    global pos
    pos = pos +1
    chr = calculateList[pos]
    if (chr == "+"):
        return Exp() + Exp()
    elif (chr == "-"):
        return Exp() - Exp()
    elif (chr == "*"):
        return Exp() * Exp()
    elif (chr == "/"):
        return Exp() / Exp()
    else:
        return float(chr)
def main():
    print("请输入需要求解的波兰表达式(前缀):", end="")
    global calculateList
    calculateList = input().strip().split(" ")
    result = Exp()
    print("计算结果为:%f"%result)

if __name__ == "__main__":
    main()

原文地址:https://www.cnblogs.com/an-wl/p/12345510.html

时间: 2024-10-06 13:59:48

递归--逆波兰表达式的相关文章

逆波兰表达式(栈,递归)

1696:逆波兰表达式 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. 输出 输出为一行,表达式的值.可直接用pr

逆波兰表达式 (递归+结构体函数)

标题:逆波兰表达式 正常的表达式称为中缀表达式,运算符在中间,主要是给人阅读的,机器求解并不方便. 例如:3 + 5 * (2 + 6) - 1 而且,常常需要用括号来改变运算次序. 相反,如果使用逆波兰表达式(前缀表达式)表示,上面的算式则表示为: - + 3 * 5 + 2 6 1 不再需要括号,机器可以用递归的方法很方便地求解. 为了简便,我们假设: 1. 只有 + - * 三种运算符 2. 每个运算数都是一个小于10的非负整数 下面的程序对一个逆波兰表示串进行求值. 其返回值为一个结构:

递归--练习10--noi1696逆波兰表达式

递归--练习10--noi1696逆波兰表达式 一.心得 递归大法好 二.题目 1696:逆波兰表达式 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算

逆波兰表达式

1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. 输出 输出为一行,表达式的值.可直接用prin

AC日记——逆波兰表达式 openjudge 3.3 1696

1696:逆波兰表达式 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. 输出 输出为一行,表达式的值.可直接用pr

2694:逆波兰表达式

2694:逆波兰表达式 查看 提交 统计 提示 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. 输出 输出为

求解逆波兰表达式(前缀表达式)

首先介绍一下逆波兰表达式 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4. 这个表达式的求法有很多种 这里介绍一种用递归求解的方法.. 时间复杂度O(n); 首先我们需要把表达式转换成运算符和数字. 用一个数组记录i位置是数字还是运算符. 如果是数字是浮点数的话可使用atof(str)把字符串转换为一个doubl

蓝桥杯-逆波兰表达式

逆波兰表达式 正常的表达式称为中缀表达式,运算符在中间,主要是给人阅读的,机器求解并不方便. 例如:3 + 5 * (2 + 6) - 1 而且,常常需要用括号来改变运算次序. 相反,如果使用逆波兰表达式(前缀表达式)表示,上面的算式则表示为: -+ 3 * 5 + 2 6 1 不再需要括号,机器可以用递归的方法很方便地求解. 为了简便,我们假设: 1. 只有 + - * 三种运算符 2. 每个运算数都是一个小于10的非负整数 下面的程序对一个逆波兰表示串进行求值. 其返回值为一个结构:其中第一

#ybt1198 逆波兰表达式

ybt1198 逆波兰表达式 题目描述] 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. [输入] 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. [输出] 输出为一行,表达式的值. 可直接用printf("%f\n", v