RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1292258
Accepted
bdc1
bdc1
Asked:2022-06-06 06:12:02 +0000 UTC2022-06-06 06:12:02 +0000 UTC 2022-06-06 06:12:02 +0000 UTC

堆栈 - 按代码修订,python。需要帮忙!

  • 772

我试图修复导师指出的两个错误(我将在下面描述它们) - 过了一段时间,整个代码停止工作,愚蠢地出现了 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'
python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    GrAnd
    2022-06-06T16:14:40Z2022-06-06T16:14:40Z

    第一个错误——忘记return在函数中Stack.pop()。
    第二个错误是对相同元素执行算术运算。这是必要stack.push(operators[element](el2, el1))的,但你有el1, el1。

    其余部分见代码:

    import math
    
    class Stack:
        def __init__(self):
            self.items = []
    
        def push(self, item):
            self.items.append(item)
    
        def pop(self): #- 8:9
            try:
                return self.items.pop()
            except IndexError:
                raise IndexError('Недостаточно операндов для вычисления.')
    
        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,
                 '%': lambda x, y: x % y,
                 '^': lambda x, y: x ** y}
    
    def MyInt(value):
        if isinstance(value, str):
            return int(value)
        return math.floor(value)
    
    def calculator(line, stack=None, converter=int, operators=OPERATORS):
        stack = Stack() if stack is None else stack
        for element in line:
            if element in operators:
                el1, el2 = stack.pop(), stack.pop()
                try:
                    stack.push(converter(operators[element](el2, el1)))
                except ZeroDivisionError:
                    raise ZeroDivisionError(f'Деление на 0 при вычислении "{el2} {element} {el1}".')
                except TypeError:
                    raise TypeError(f'Неподдерживаемая операция "{element}" для типа {converter.__name__}.')
            else:
                try:
                    stack.push(converter(element)) #- 29 строка
                except:
                    raise KeyError(f'Невозможно преобразовать "{element}" в {converter.__name__} или неподдерживаемая операция.')
        if stack.size() > 1:
            raise IndexError('Некорректное выражение - в стеке остались элементы.')
        return stack.pop()
    
    
    if __name__ == '__main__':
        from decimal import Decimal
        #line = input().split()
        for line in ("10 2 4 * -", "12 5 /", "-1 3 /", "1.5 3.7 + 2.1 *", "2+3j -5-7j *", "2 3 ^ 3 %", "2 0 /", "1 2 3 +", "1 2 + *"):
            print(f'\n Выражение : "{line}"')
            line = line.split()
            for t in (int, MyInt, float, complex, Decimal):
                print(f"{t.__name__:>10} = ", end='')
                try:
                    print(calculator(line, converter=t))
                except (KeyError, IndexError, ZeroDivisionError, TypeError) as err:
                    print("Ошибка!", err)
    
     Выражение : "10 2 4 * -"
           int = 2
         MyInt = 2
         float = 2.0
       complex = (2+0j)
       Decimal = 2
    
     Выражение : "12 5 /"
           int = 2
         MyInt = 2
         float = 2.4
       complex = (2.4+0j)
       Decimal = 2.4
    
     Выражение : "-1 3 /"
           int = 0
         MyInt = -1
         float = -0.3333333333333333
       complex = (-0.3333333333333333+0j)
       Decimal = -0.3333333333333333333333333333
    
     Выражение : "1.5 3.7 + 2.1 *"
           int = Ошибка! 'Невозможно преобразовать "1.5" в int или неподдерживаемая операция.'
         MyInt = Ошибка! 'Невозможно преобразовать "1.5" в MyInt или неподдерживаемая операция.'
         float = 10.920000000000002
       complex = (10.920000000000002+0j)
       Decimal = 10.92
    
     Выражение : "2+3j -5-7j *"
           int = Ошибка! 'Невозможно преобразовать "2+3j" в int или неподдерживаемая операция.'
         MyInt = Ошибка! 'Невозможно преобразовать "2+3j" в MyInt или неподдерживаемая операция.'
         float = Ошибка! 'Невозможно преобразовать "2+3j" в float или неподдерживаемая операция.'
       complex = (11-29j)
       Decimal = Ошибка! 'Невозможно преобразовать "2+3j" в Decimal или неподдерживаемая операция.'
    
     Выражение : "2 3 ^ 3 %"
           int = 2
         MyInt = 2
         float = 2.0
       complex = Ошибка! Неподдерживаемая операция "%" для типа complex.
       Decimal = 2
    
     Выражение : "2 0 /"
           int = Ошибка! Деление на 0 при вычислении "2 / 0".
         MyInt = Ошибка! Деление на 0 при вычислении "2 / 0".
         float = Ошибка! Деление на 0 при вычислении "2.0 / 0.0".
       complex = Ошибка! Деление на 0 при вычислении "(2+0j) / 0j".
       Decimal = Ошибка! Деление на 0 при вычислении "2 / 0".
    
     Выражение : "1 2 3 +"
           int = Ошибка! Некорректное выражение - в стеке остались элементы.
         MyInt = Ошибка! Некорректное выражение - в стеке остались элементы.
         float = Ошибка! Некорректное выражение - в стеке остались элементы.
       complex = Ошибка! Некорректное выражение - в стеке остались элементы.
       Decimal = Ошибка! Некорректное выражение - в стеке остались элементы.
    
     Выражение : "1 2 + *"
           int = Ошибка! Недостаточно операндов для вычисления.
         MyInt = Ошибка! Недостаточно операндов для вычисления.
         float = Ошибка! Недостаточно операндов для вычисления.
       complex = Ошибка! Недостаточно операндов для вычисления.
       Decimal = Ошибка! Недостаточно операндов для вычисления.
    
    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5