为什么我的后缀评估功能不起作用?

问题描述 投票:0回答:1

这是我到目前为止所拥有的,这是我同学编写的一些Python代码的延续,我们不断收到很多错误。

我认为错误存在于 if 和 for 循环中的某个地方,但我对编码相当陌生,因此我们将不胜感激。

def postfix(expr_str: str) -> float:
    op = ['+', '-', '*', '/']
    mystack = []
    ch = expr_str.split()
    
    if ch not in op:
        mystack.append(ch)
    for ch in expr_str:
        if ch.isdigit():
            mystack.append(ch)
        else:
            op_2 = mystack.pop() # remove mst recent operand from stack first
            op_1 = mystack.pop() # remove first operand from the stack after
            if ch == '+':
                mystack.append(op_1 + op_2)
            elif ch == '-':
                mystack.append(op_1 - op_2)
            elif ch == '/':
                mystack.append(op_1 - op_2)
            elif ch == '*':
                mystack.append(op_1 / op_2)
            mystack.append(mystack)
    return (''.join(mystack))

我已经尝试通过编码室运行它,但有很多错误。

python postfix-notation
1个回答
0
投票

您的代码中存在不少问题:

  • if ch not in op
    没有任何意义,因为
    ch
    此时是一个字符串列表 - 这是您从
    expr_str.split()
    获得的。这个
    if
    块不应该存在,也不应该存在对
    ch
    的赋值。因此,变量
    op
    也不再被使用。只需删除该代码即可。

  • for ch in expr_str:
    将从输入字符串中读取单个字符。这会将“123”拆分为“1”、“2”和“3”。相反,这里是执行
    for ch in expr_str.split()
    的好时机,假设给定的表达式是空格分隔的,例如“1 2 3 * +”。

  • mystack.append(op_1 + op_2)
    假设
    op_1
    op_2
    是数字,但您的代码仅将字符串放入堆栈,而不是数字。因此,将
    mystack.append(ch)
    isdigit
    测试之后的那个)更改为
    mystack.append(int(ch))

  • 您没有在应该执行的地方应用乘法和除法。

  • mystack.append(mystack)
    没有任何意义:它会复制堆栈的内容。该声明应删除。

  • 经过上述修正后,

    ''.join(mystack)
    将不起作用,因为现在堆栈中有数字,而不是字符串。事实上,如果输入表达式在语义上是正确的,则堆栈上应该有“恰好”一个数字,因此您实际上应该执行“return stack[0]”或“
    return stack[-1]

  • 通过上述修复,您的代码将如下所示:

def postfix(expr_str) -> float: mystack = [] for ch in expr_str.split(): if ch.isdigit(): mystack.append(int(ch)) else: op_2 = mystack.pop() op_1 = mystack.pop() if ch == '+': mystack.append(op_1 + op_2) elif ch == '-': mystack.append(op_1 - op_2) elif ch == '/': mystack.append(op_1 / op_2) elif ch == '*': mystack.append(op_1 * op_2) return (mystack[0])

您可以通过检查输入字符串中的错误来进一步改进,例如无效的运算符(在最后一个 
else

之后添加

elif
),或操作数太少(当您要
 时列表为空时会发生这种情况) pop
),或者操作数太多(当堆栈末尾有多个数字时会发生这种情况),或者输入为空,...等等。
运行示例:

print(postfix("1 2 3 * +")) # 7

© www.soinside.com 2019 - 2024. All rights reserved.