【发布时间】:2015-01-08 20:20:17
【问题描述】:
我正在编写一个 python 程序来计算公式。我读入了一个包含值、运算符和函数的字符串列表。
下面显示的代码接收一个字符串例如:
['not', 1.0, 2.0, '=', 'power', 2.0, 3.0, '+']
上面的代码是数学问题的后缀版本:power(2,3)+not(2=1) 程序应先计算 not(2=1),得到 1,然后计算 power(2,3),得到 9,然后计算 8+0,得到 8。
到目前为止,我计算答案的代码
stack = []
def calculate(inputs):
if (inputs[0] == "sum"):
inputs.remove("sum")
for a in inputs:
if (a) == "not":
inputs.remove(a)
op1, op2 = inputs[0], inputs[1]
inputs.remove(op1)
inputs.remove(op2)
if op1 != op2:
stack.append('0')
else:
stack.append('1')
continue
if (a) == 'power':
inputs.remove(a)
continue
if type(a) is float:
stack.append(a)
continue
op1, op2 = stack.pop(), stack.pop()
#if a == 'power':
if a == '+':
stack.append(op2 + op1)
elif a == '-':
stack.append(op1 - op2)
elif a == '*':
stack.append(op2 * op1)
elif a == '/':
stack.append(op1 / op2)
elif a == '=':
if op1 != op2:
stack.append('0')
else:
stack.append('1')
if (len(stack) > 1):
lenStack = len(stack)-1
for x in range(0, lenStack):
stack.append('+')
stack.append(_calcSum(stack))
return stack.pop()
def _calcSum(stack):
newStack = []
for a in stack:
if type(a) is float:
newStack.append(a)
continue
op1, op2 = newStack.pop(), newStack.pop()
if a == '+':
newStack.append(op2 + op1)
elif a == '-':
newStack.append(op1 - op2)
elif a == '*':
newStack.append(op2 * op1)
elif a == '/':
newStack.append(op1 / op2)
return newStack.pop()
但是我遇到了 NOT 和 POWER 语句的问题;我不知道如何自动检查这些。谁能指出我正确的方向或协助我的代码?当我尝试检查“电源”时,它只是跳过了我的其余代码并尝试打印堆栈 - 这是空的导致错误。
【问题讨论】:
-
你能发个MCVE吗?
-
@Christian 我不确定您还需要什么?我已经发布了复制问题时使用的代码。
-
我认为他的意思是让您准确地确定哪些内容不适合您,以及您尝试过的内容 - 而不是发布您的整个脚本。
-
power(2,3)+not(2=1)的后缀表示法不应该是2, 3, power, 2, 1, =, not, +吗? -
请检查并更正代码的缩进。另外,我倾向于不同意彼得的观点,即这不是正确的后缀。似乎有些运算符在之后,而有些则在它们各自的参数之前。也许这是唯一的问题?