我遇到的问题是计算后缀形式表达式:例如,(1, 2, '+', 3, '*')。
通过使用以下算法计算表达式: 1. 如果表达式仅包含整数,则返回该整数。2. 否则,维护一个堆栈。循环遍历元组并将每个元素推入堆栈。如果该元素是运算符,则将前两个元素弹出堆栈,计算结果并将结果压入堆栈。为了说明这一点,我们以上面的例子为例。最初,堆栈是空的。测试用例是
calculate((1, 2, '*', 3, '-', 2, '*', 5, '+'))
3
Run Code Online (Sandbox Code Playgroud)
而我的第一个代码不好(硬编码和所有 >< ):
def calculate(inputs):
if len(inputs) ==1:
return inputs[0]
elif len(inputs) == 5:
s= []
push_stack(s, inputs[0])
push_stack(s, inputs[1])
if inputs[2] == '*':
A = s.pop() * s.pop()
elif inputs[2] == '+':
A = s.pop() + s.pop()
elif inputs[2] == '-':
A= s.pop() - s.pop()
elif inputs[2] == '/':
A = s.pop() / s.pop()
s.clear()
s= [A]
push_stack(s, inputs[3])
if inputs[4] == '*':
A = s.pop() * s.pop()
elif inputs[4] == '+':
A = s.pop() + s.pop()
elif inputs[4] == '-':
A= s.pop() - s.pop()
elif inputs[4] == '/':
A = s.pop() / s.pop()
return A
else:
s= []
push_stack(s, inputs[0])
push_stack(s, inputs[1])
if inputs[2] == '*':
A = s.pop() * s.pop()
elif inputs[2] == '+':
A = s.pop() + s.pop()
elif inputs[2] == '-':
A= s.pop() - s.pop()
elif inputs[2] == '/':
A = s.pop() / s.pop()
s.clear()
s= [A]
push_stack(s, inputs[3])
if inputs[4] == '*':
A = s.pop() * s.pop()
elif inputs[4] == '+':
A = s.pop() + s.pop()
elif inputs[4] == '-':
A= s.pop() - s.pop()
elif inputs[4] == '/':
A = s.pop() / s.pop()
s.clear()
s= [A]
push_stack(s, inputs[5])
if inputs[6] == '*':
A = s.pop() * s.pop()
elif inputs[6] == '+':
A = s.pop() + s.pop()
elif inputs[6] == '-':
A= s.pop() - s.pop()
elif inputs[6] == '/':
A = s.pop() / s.pop()
s.clear()
s= [A]
push_stack(s, inputs[7])
if inputs[8] == '*':
A = s.pop() * s.pop()
elif inputs[8] == '+':
A = s.pop() + s.pop()
elif inputs[8] == '-':
A= s.pop() - s.pop()
elif inputs[8] == '/':
A = s.pop() / s.pop()
return A
Run Code Online (Sandbox Code Playgroud)
很抱歉让您读到这篇文章!然后我将样式更改为
def calculate(inputs):
if len(inputs) ==1:
return inputs[0]
else:
s =[]
for i in inputs:
if type(i) == int:
return push_stack(s, i)
elif i is '*' or '/' or 'x' or '+':
A = s.pop()
B =s.pop()
know = operator(i, A, B)
C = push_stack(s, know)
return C
def operator(sign, one, two):
if sign == '*':
A = one * two
elif sign == '+':
A = one + two
elif sign == '-':
A= one - two
elif sign == '/':
A = one / two
return A
Run Code Online (Sandbox Code Playgroud)
我是否越来越接近这个想法以及我的代码如何改进?
** 编辑 ** 使用 IDLE:
>>> calculate((1, 2, '*', 3, '-'))
[1]
>>> calculate((1, 2, '+', 3, '*'))
[1]
>>> calculate((1, 2, '*', 3, '-', 2, '*', 5, '+'))
[1]
Run Code Online (Sandbox Code Playgroud)
这不是我正在寻找的答案。应该是 1 然后 9 然后 3。
有一个问题
elif i is '*' or '/' or 'x' or '+':
Run Code Online (Sandbox Code Playgroud)
这被视为
elif (i is '*') or ('/') or ('x') or ('+'):
Run Code Online (Sandbox Code Playgroud)
这不是你想要的(这总是正确的)。你可以使用类似的东西:
elif i in ('*', '/', 'x', '+'):
Run Code Online (Sandbox Code Playgroud)
还:
if type(i) == int:
return push_stack(s, i)
Run Code Online (Sandbox Code Playgroud)
你不应该回到那里。你只是想要:
if type(i) == int:
push_stack(s, i)
Run Code Online (Sandbox Code Playgroud)
最后,我认为更好的方法是始终使用堆栈,并在函数末尾返回堆栈顶部。这使您不必为 1 元素参数创建特殊情况calculate()。把这一切放在一起,类似这样的事情应该有效:
def calculate(inputs):
stack = []
for a in inputs:
if type(a) is int:
stack.append(a)
continue
op1, op2 = stack.pop(), stack.pop()
if a == '+':
stack.append(op2 + op1)
elif a == '-':
stack.append(op2 - op1)
elif a == '*':
stack.append(op2 * op1)
elif a == '/':
stack.append(op2 / op1)
return stack.pop()
Run Code Online (Sandbox Code Playgroud)
目前,这不会进行错误检查(例如,对于格式错误的表达式),但它很容易添加。