我试图修复导师指出的两个错误(我将在下面描述它们) - 过了一段时间,整个代码停止工作,愚蠢地出现了 3 个回溯。我寻求帮助以修复错误(我认为它们很容易,但我不明白如何将它们倒入代码中)。
错误:
第 29 行: stack.push(int(element))
对于计算器的操作,将“字符串转换为数字”(数字化仪)的特定功能并不重要。因此,最好使其更具通用性。让求解器函数获取“数字化仪”作为默认值为 int 的可选参数。然后计算器将能够使用浮点数/复数/十进制/有理数/...
线 8:9 -
def pop(self):
self.items.pop()
需要安全码,因为此调用可能会失败
任务: 该任务与逆波兰表示法有关。它用于解析算术表达式。它有时也称为后缀表示法。在后缀表示法中,操作数放在运算符符号之前。示例 1:
3 4 +
означает 3 + 4 и равно 7
示例 2:
12 5 /
Так как деление целочисленное, то в результате получим 2.
Пример 3:
10 2 4 * -
означает 10 - 2 * 4 и равно 2
让我们仔细看看最后一个例子:
* 符号紧跟在数字 2 和 4 之后,这意味着您需要对它们应用此符号表示的操作,即,将这两个数字相乘。结果,我们得到 8。之后,表达式将采用以下形式:
10 8 -
减法运算必须应用于它前面的两个数字,即 10 和 8。结果,我们得到 2。
让我们更详细地考虑该算法。为了实现它,我们将使用堆栈。要计算用逆波兰表示法编写的表达式的值,您需要从左到右读取表达式并执行以下步骤: 处理输入字符:
如果一个操作数作为输入,它被压入栈顶。
如果给输入一个操作符号,那么这个操作就是按照加法的顺序对从栈中取出的所需数量的值进行的。执行操作的结果放在栈顶。
如果输入字符集没有被完全处理,则转到步骤1。输入字符集被完全处理后,表达式求值的结果在栈顶。如果堆栈上剩下几个数字,则只应显示顶部元素。
关于负数和除法的注意事项:在这个问题中,除法是指数学整数除法。这意味着它总是向下取整。即:如果a / b = c,则b ⋅ c 是不超过a 且能同时被b 整除且无余数的最大数。例如,-1 / 3 = -1。请注意:例如,在 C++、Java 和 Go 中,数字除法的工作方式不同。在当前问题中,保证没有除以负数。
输入格式
单行包含一个用反向波兰表示法编写的表达式。数字和算术运算用空格书写。运算可以作为输入:+, -, *, /和数字,模不超过10000。保证测试数据模中的中间表达式的值不超过50000。
输出格式
打印一个数字——表达式的值。
示例 1:
输入:
2 1 + 3 *
结论:
9
示例 2:
输入:
7 2 + 4 * 2 +
结论:
38
我的代码:
class Stack:
def __init__(self):
self.items = []
def push(self, item):
self.items.append(item)
def pop(self): - 8:9
self.items.pop()
def size(self):
return len(self.items)
OPERATORS = {'+': lambda x, y: x + y,
'-': lambda x, y: x - y,
'*': lambda x, y: x * y,
'/': lambda x, y: x // y}
def calculator(line, stack=None, operators=OPERATORS):
stack = Stack() if stack is None else stack
for element in line:
if element in operators:
el1, el2 = stack.pop(), stack.pop()
stack.push(operators[element](el1, el1))
else:
try:
stack.push(int(element)) - 29 строка
except:
raise KeyError('WRONG_KEY')
return stack.pop()
if __name__ == '__main__':
line = input().split()
print(calculator(line))
代码输出错误:
Traceback (most recent call last):
File "final_b_13.py", line 37, in <module>
print(calculator(line))
File "final_b_13.py", line 26, in calculator
stack.push(operators[element](el1, el1))
File "final_b_13.py", line 15, in <lambda>
OPERATORS = {'+': lambda x, y: x + y,
TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'
第一个错误——忘记
return在函数中Stack.pop()。第二个错误是对相同元素执行算术运算。这是必要
stack.push(operators[element](el2, el1))的,但你有el1, el1。其余部分见代码: