我正在创建一个执行简单(+, - ,*,/)操作的后缀计算器。运行此代码并使用两个单位数字工作正常。但是,使用一个两位数字(15,20等),它将数字存储为[' 1,' 5']而不是15,然后操作混乱。我该如何解决这个问题?
evaluation = Stack()
def main():
expression = str(input("Enter an expression: "))
expression = expression.replace(" ","")
for x in expression:
evaluation.push(x)
while len(evaluation) > 1:
check = evaluation.pop()
if check == "+":
first = evaluation.pop()
second = evaluation.pop()
temp = int(second) + int(first)
evaluation.push(temp)
elif check == "-":
first = evaluation.pop()
second = evaluation.pop()
temp = int(second) - int(first)
evaluation.push(temp)
elif check == "/":
first = evaluation.pop()
second = evaluation.pop()
temp = int(second) / int(first)
evaluation.push(temp)
elif check == "*":
first = evaluation.pop()
second = evaluation.pop()
temp = int(second) * int(first)
evaluation.push(temp)
elif check != "+" or check != "-" or check != "*" or check != "/":
evaluation.push(check)
print("Answer:", evaluation.data[0])
答案 0 :(得分:0)
不要从表达式中删除空格,但使用它将表达式split
转换为可用部分:
In [1]: '223 370 * 45 /'.split()
Out[1]: ['223', '370', '*', '45', '/']
迭代你现在获得的列表。要检查列表项是否为运算符,只需使用in
:
In [4]: '+' in '+-/*'
Out[4]: True
如果该项目不是运算符,则它必须是数字,因此请在其上使用float()
并将其推入堆栈。
由于您已定义的所有运算符,您只需弹出一次操作数。由于普通的数学运算符也可用作函数,因此您可以使用字典来调用它们,而不是编写长if / elif;
In [1]: from operator import add, sub, mul, div
In [2]: ops = {'+': add, '-': sub, '*': mul, '/': div}
In [3]: ops['+'](1, 3)
Out[3]: 4
In [4]: ops['/'](1.0, 3.0)
Out[4]: 0.3333333333333333
所以一个简单的计算器函数可以像这样写出来;
from operator import add, sub, mul, div
_ops = {'+': add, '-': sub, '*': mul, '/': div}
def postfix(expr):
"""Evaluate a postsfix expression
:param expr: The expression to evaluate
:returns: result of the expression
"""
items = expr.split()
if not items:
raise ValueError("Empty expression")
stk = [] # A plain list works fine here.
for i in items:
if i not in '+-*/':
# float() will raise an exception if it doesn't find a number.
stk.append(float(i))
else:
try:
b = stk.pop()
a = stk.pop()
stk.append(_ops[i](a, b))
except IndexError:
raise ValueError('Invalid expression; empty stack')
return stk[-1]
答案 1 :(得分:0)
当你谈到这一点时:
elif check != "+" or check != "-" or check != "*" or check != "/":
evaluation.push(check)
你实际上将一个符号推入堆栈。 你可能会做的是继续阅读符号(数字),直到你没有遇到其他东西,然后将你读过的整个字符串转换成一个整数并推送它。
答案 2 :(得分:0)
我认为您遇到了麻烦,因为您正在迭代输入中的每个字符。
我做两件事之一: - 分解输入 - 分别询问第一个数字,操作和第二个数字 - 遍历输入中的每个字符并确定它是什么,然后对其进行校正。
请记住,您将要确保您对运营商的帐户可能是\并且如果您在两个整数上使用它,您将获得一个int而不是一个浮点数,这可能更合适。
答案 3 :(得分:0)
您可以使用正则表达式:
expression = "1234+567"
sign_index = [m.start() for m in re.finditer(r'[+-/*]', expression)][0]
sign = expression[sign_index]
first_num = int(expression.split(sign)[0])
second_num = int(expression.split(sign)[1])