【问题标题】:Why do I get an error on stack in Python?为什么我在 Python 中的堆栈上出现错误?
【发布时间】:2020-10-10 18:53:02
【问题描述】:

我已经在 Python 中编写了以下代码,但每次数组“堆栈”上出现错误时,除了初始分配之外,它还显示堆栈。错误是“'list' 的实例没有 'push' 成员”。

为了澄清,这段代码是遍历每个字符并检查它是否是一个左括号。它将推入堆栈,打开括号,我将通过 if/else 语句进行匹配,以查看它们是否匹配对。如果不匹配,则返回 false。

有谁知道为什么这段代码会在堆栈上出错?堆栈对我来说很新,它们没有意义。这是我用 Python 编写的第一段代码,所以我的语法也可能有错误。

我已从堆栈视频中获取代码的建议,并尝试将其转换为 python 以查看它的工作原理。他们使用的代码只是应该发生的事情的指导。

str = '()[(]())'
arr = ['(','[']
stack = []

for char in str:
    if char in arr:
        stack.push(char)  
    else:
        if stack.empty(): 
            top = stack.pop()
            break
        if(top == '[' and char != ']') or (top == '(' and char != ')'):
            break
return stack.empty()

【问题讨论】:

  • 请将完整的错误回溯添加到您的问题中。
  • 注意:不要使用str作为变量名。您可能会将其与str() 混淆。
  • 因为列表中没有 push() 方法。请改用append()
  • 列表中没有pushempty
  • edit您的问题澄清您要做什么。 list 类型既没有 push 也没有 empty 方法。为什么你认为这应该有效?您认为最后的if 声明中的top 是什么?

标签: python for-loop stack


【解决方案1】:

您的功能无效。 python中的列表既没有push()也没有empty()方法。您应该修改代码以分别使用append()len(stack) 而不是这两个。

修改后的代码如下所示 -

str1 = '()[(]())'
str2 = '()[]()'
arr = ['(','[']


def check_parentheses(str):
    stack = []
    for char in str:
        if char in arr:
            stack.append(char)  
        else:
            # If our stack is empty, there's no closing bracket to match the opening one, hence invalid
            if not stack:        # Same as len(stack) == 0
                return "Invalid"
            else:
                # if closing bracket doesn't match opening bracket, then too it's invalid
                top = stack.pop()
                if(top=='[' and char != ']' or top == '(' and char != ')' ):
                    return "Invalid"
    # If all the above checks are passed, we can be sure that parentheses are valid and balanced :)
    return "Valid"


print(check_parentheses(str1))
print(check_parentheses(str2))

输出:

Invalid
Valid

我建议您参考python docs - list 以获取有关列表的更多信息以及您可以在其上使用的方法。

希望这会有所帮助!

【讨论】:

  • 这对我理解我的翻译哪里出错非常有帮助。在这方面我有很多东西要学。这就解释了为什么它标记为“推送”。
  • 很高兴为您提供帮助!我还提供了一个链接,您可以在其中了解列表中使用的其他方法
  • 请注意,容器具有布尔含义——习惯用法是使用if not stack: 而不是if len(stack) == 0:。使用字符串来包含结果是脆弱的;返回TrueFalse 似乎更合适。
  • @MisterMiyagi 是的,对。但是,我认为明确提及len(stack)==0 会更容易理解。我已经进行了编辑并包含了您的建议
猜你喜欢
  • 2021-10-01
  • 2022-01-13
  • 2021-06-18
  • 2019-01-09
  • 2021-09-05
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
相关资源
最近更新 更多