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

时间:2013-09-28 10:59:52

标签: python

我在Python中创建了一个程序,如果ab元素的数量相等则返回一个布尔值True,否则返回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)

3 个答案:

答案 0 :(得分:2)

假设您的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'] )

或(由Erik Allik建议)

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

答案 1 :(得分:2)

您的equal函数采用名为S的参数,但是在函数的开头,您将覆盖新传递给函数的S的内容创建了空堆栈:S = Stack(),所以只需删除该行,就可以减少一个错误。

另外,我认为你的push()函数,无论你在哪里定义,都应该是Stack类的一种方法,这是公平的。否则将堆栈定义为类没有意义,但不能以方法的形式将所有紧密堆栈相关的操作放入该类中。

答案 2 :(得分:0)

以及

的问题
S = Stack()

覆盖堆栈以获得0的长度,一旦修复,您将因为使用而崩溃:

var = s.pop()

而不是

var = S.pop()

请注意,快速执行此操作的方法是

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