You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现RPN栈计算器时calculation函数无法访问输入列表问题

问题排查与修正方案

你的代码存在3个核心问题:

  • 输入采集函数无终止逻辑与返回值:inputs() 内的while True是无限循环,没有设置触发停止的条件,也没有return语句返回收集到的输入列表,调用后既不会结束运行,也无法返回数据供计算逻辑使用。
  • 命名冲突:函数名、函数内存储输入的列表名、calculation()的参数名全部使用inputs,会导致作用域混乱,无法正确调用函数或读取变量。
  • 传参逻辑冗余:calculation()的参数没有实际作用,函数第一行就将参数覆盖为inputs()的返回值,两种传参逻辑冲突。

修正后可运行代码

# 输入采集函数,输入=时终止并返回输入列表
def get_rpn_input():
    operators = {'+', '-', '*', '/', '%', '='}
    input_list = []
    print("请逐行输入逆波兰表达式元素,输入=结束:")
    while True:
        blank = input().strip()
        # 遇到终止符=时返回收集到的列表
        if blank == '=':
            return input_list
        if blank not in operators:
            # 增加非法输入捕获,避免非整数字符串转换报错
            try:
                input_list.append(int(blank))
            except ValueError:
                print("无效输入,请输入整数或支持的运算符(+ - * / %)")
                continue
        else:
            input_list.append(blank)
        print("当前输入列表: ", input_list)

# 计算逻辑函数
def calculation(input_list=None):
    # 支持直接传入预处理好的输入列表,也支持主动采集用户输入
    if input_list is None:
        input_list = get_rpn_input()
    stack = []
    for a in input_list:
        if isinstance(a, int):
            stack.append(a)
            print(f"入栈元素{a},当前栈: {stack}")
            continue
        # 运算前校验栈内元素数量,避免表达式不合法报错
        if len(stack) < 2:
            print("表达式不合法:运算符前缺少操作数")
            return None
        op2, op1 = stack.pop(), stack.pop()
        if a == '+':
            result = op1 + op2
        elif a == '-':
            result = op1 - op2
        elif a == '*':
            result = op1 * op2
        elif a == '/':
            # 整数除法可按需调整为浮点数除法
            result = int(op1 / op2)
        elif a == '%':
            result = op1 % op2
        else:
            print(f"不支持的运算符{a}")
            return None
        stack.append(result)
        print(f"执行运算{op1} {a} {op2} = {result},当前栈: {stack}")
    # 校验最终栈内元素数量,判断表达式合法性
    if len(stack) == 1:
        return stack[0]
    else:
        print("表达式不合法:操作数过多")
        return None

# 调用示例
if __name__ == "__main__":
    calc_result = calculation()
    if calc_result is not None:
        print(f"最终计算结果为: {calc_result}")

使用示例

比如要计算逆波兰表达式3 4 +(即中缀的3+4),按顺序输入:

  1. 输入3
  2. 输入4
  3. 输入+
  4. 输入=
    即可得到计算结果7。

内容的提问来源于stack exchange,提问作者up91

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:54:00