这是我到目前为止所拥有的,这是我同学编写的一些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))
我已经尝试通过编码室运行它,但有很多错误。
您的代码中存在不少问题:
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