我在Python中创建了一个程序,如果a
和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)
答案 0 :(得分:2)
假设您的Stack
类是堆栈容器的一些有效实现,您似乎正在创建空堆栈
S = Stack()
可能你想使用像
这样的东西S = Stack(S)
因此,检查是否有相同数量的'a'和'b'总是返回True(StackA.size() == 0
和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' )
答案 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']