0

aPython でプログラムを作成しました。このプログラムは、要素と要素の数が等しい場合はブール値の True 値を返し、bそうでない場合は False を返します。これを実行するたびに、「False」ではなく「True」の出力が得られます。誰かが私のコードの問題を理解できますか?

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' と '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' )
于 2013-09-28T11:04:38.670 に答える
2

あなたのequal関数は という名前のパラメータを取りますが、関数の最初で、新しく作成された空のスタックで関数に渡されたS内容を上書きしているので、その行を削除するだけでバグが1つ少なくなります.SS = 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 に答える