如何基于RPN算法计算转换后的表达式数值?
RPN(逆波兰表示法)计算核心逻辑与实例演示
计算RPN格式的表达式,核心依赖**栈(Stack)**数据结构,遵循以下规则:
- 遍历RPN字符串的每个元素(按空格拆分)
- 遇到数字,直接压入栈
- 遇到运算符,从栈顶弹出两个元素:先弹出的是右操作数,后弹出的是左操作数,用运算符计算后将结果压回栈
- 遍历完成后,栈中仅剩的元素就是最终结果
针对你的RPN表达式「3 23 24 / 34 * 24 / +」的分步计算:
拆分后的元素列表:["3", "23", "24", "/", "34", "*", "24", "/", "+"]
- 处理"3" → 栈:
[3] - 处理"23" → 栈:
[3, 23] - 处理"24" → 栈:
[3, 23, 24] - 处理"/":弹出24和23,计算
23 / 24 ≈ 0.9583→ 栈:[3, 0.9583] - 处理"34" → 栈:
[3, 0.9583, 34] - 处理"*":弹出34和0.9583,计算
0.9583 * 34 ≈ 32.5833→ 栈:[3, 32.5833] - 处理"24" → 栈:
[3, 32.5833, 24] - 处理"/":弹出24和32.5833,计算
32.5833 / 24 ≈ 1.3576→ 栈:[3, 1.3576] - 处理"+":弹出1.3576和3,计算
3 + 1.3576 ≈ 4.3576→ 栈:[4.3576]
最终结果约为4.3576(保留四位小数)
代码实现示例(Python)
def calculate_rpn(rpn_str): stack = [] tokens = rpn_str.split() for token in tokens: if token in '+-*/': # 弹出右、左操作数 right = stack.pop() left = stack.pop() if token == '+': res = left + right elif token == '-': res = left - right elif token == '*': res = left * right elif token == '/': # 浮点除法,避免整数除法截断 res = left / right stack.append(res) else: # 转换为浮点型,兼容整数和小数输入 stack.append(float(token)) # 遍历结束后栈顶即为结果 return stack[0] # 测试你的表达式 target_rpn = "3 23 24 / 34 * 24 / +" final_result = calculate_rpn(target_rpn) print(f"计算结果:{round(final_result, 4)}")
内容的提问来源于stack exchange,提问作者Tomasz Okraszewski
相关产品推荐
相关产品推荐

