0

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

3 回答 3

2

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

S = Stack()

可能你想使用类似的东西

S = Stack(S)

所以检查其中是否有相同数量的 'a's 和 'b's 总是返回 True (as StackA.size() == 0and StackB.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' )
于 2013-09-28T11:04:38.670 回答
2

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

另外,我认为建议您的push()函数(无论您在何处定义它)都应该是Stack该类的方法,这是公平的;否则将堆栈定义为一个类但没有将所有与堆栈紧密相关的操作以方法的形式放入该类中是没有意义的。

于 2013-09-28T11:05:44.317 回答
0

以及问题

S = Stack()

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

var = s.pop()

代替

var = S.pop()

请注意,这样做的快速方法是

from collections import Counter
counts = Counter(S)
return counts['a'] == counts['b']
于 2013-09-28T11:08:40.497 回答