如何在函数中传递堆栈项?

2024-05-15 01:16:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python创建了一个程序,如果ab元素的数目相等,则返回布尔真值,否则返回False。每次运行它时,我都会得到一个“True”输出,而不是“False”。有人能找出我代码的问题吗?你知道吗

def equal(s):
    s = Stack()
    stack_a = Stack()
    stack_b = Stack()
    while not s.is_empty():
        if s.top() == 'a':
            var = s.pop()
            push(stack_a, var)
        else:
            var = s.pop()
            push(stack_b, var)
    if stack_a.size() == stack_b.size():
        return True
    else:
        return False 

my_list = ['a', 'a', 'a', 'b']
print equal(my_list)

Tags: 程序falsetruesizereturnifstackvar
3条回答

您的equal函数接受一个名为S的参数,但是就在函数的开头,您正在用一个新创建的空堆栈S = Stack()覆盖传递到函数中的S的内容,所以只要删除该行,您就少了一个bug。你知道吗

另外,我认为可以公平地建议您的push()函数,无论您在哪里定义它,都应该是Stack类的一个方法;否则,将堆栈定义为一个类而不是将所有与堆栈紧密相关的操作以方法的形式放入该类是没有意义的。你知道吗

假设您的Stack类是堆栈容器的某个有效实现,那么您似乎正在创建一个空的堆栈

S = Stack()

可能你想用

S = Stack(S)

所以检查是否有相同数量的“a”和“b”总是返回True(如StackA.size() == 0StackB.size() == 0

而且,更简单的方法是

def equal(S):
    return len( [x for x in S if x=='a'] ) == len( [x for x in S if x=='b'] )

或者(正如埃里克·阿利克建议的那样)

def equal(S):
    return sum( 1 for x in S if x=='a' ) == sum( 1 for x in S if x=='b' )

以及你的问题

S = Stack()

重写堆栈以获得0的长度,修复后将出现崩溃,因为您正在使用:

var = s.pop()

而不是

var = S.pop()

请注意,快速的方法是

from collections import Counter
counts = Counter(S)
return counts['a'] == counts['b']

相关问题 更多 >

    热门问题