为什么Python中的堆栈会出错?

为什么Python中的堆栈会出错?,python,for-loop,stack,Python,For Loop,Stack,我已经用Python编写了下面的代码,但是每次数组“stack”除了初始赋值之外都会出现错误。错误是“列表”的实例没有“推送”成员” 为了澄清,这段代码将遍历每个字符,并检查它是否是一个左括号。它将推入堆栈,左括号和I将通过if/else语句进行匹配,以查看它们是否匹配。如果不匹配,则返回false 有人知道为什么这段代码在堆栈上出现错误吗?堆栈对我来说是非常新的,它们没有意义。这是我用Python编写的第一段代码,因此我的语法可能也有错误 我从stacks上的一个视频中得到了代码的建议,并尝试

我已经用Python编写了下面的代码,但是每次数组“stack”除了初始赋值之外都会出现错误。错误是“列表”的实例没有“推送”成员”

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

有人知道为什么这段代码在堆栈上出现错误吗?堆栈对我来说是非常新的,它们没有意义。这是我用Python编写的第一段代码,因此我的语法可能也有错误

我从stacks上的一个视频中得到了代码的建议,并尝试将其翻译成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()

您的函数无效。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
我建议您参考以获取有关列表的更多信息,以及您可以在列表上使用的方法


希望这有帮助

请将完整的错误回溯添加到您的问题中。注意:不要将
str
用作变量名。您可能会将其与
str()
混淆,因为列表中没有
push()
方法。使用
append()
代替列表中没有
push
empty
。请您的问题澄清您想做什么。
list
类型既没有
push
方法,也没有
empty
方法。你为什么认为这应该有效?在最后的
if
语句中,你认为
top
是什么?这对我理解翻译中的错误非常有帮助。在这方面我有很多东西要学。这就解释了为什么它在标记“推”。很高兴能帮忙!我还提供了一个链接,您可以从中了解listNote中使用的其他方法注意,容器具有布尔意义–习惯用法是使用
如果不是堆栈:
,而不是
如果len(stack)==0:
。使用字符串来包含结果是脆弱的;返回
True
False
似乎更合适。@MisterMiyagi是的,对。但是,我认为明确提到
len(stack)==0会更容易理解。我已经做了编辑,包括了你的建议