2017-01-25 4 views
0

文字列の中に括弧があるかどうかをチェックするコードです。角括弧( "("、 ")"、 "<", ">")が平衡しているかどうかをスタッククラスを使って確認する - python

print(balanced_brackets('(<x)>(())()')) 
print(balanced_brackets('x<y)(>z')) 
print(balanced_brackets('<(x)<y>)z')) 

次の出力は、すべての印刷

False 

べきであるが、彼らはいくつかの理由で

True 

を印刷:次のテストのために

def balanced_brackets(text): 

    s = Stack() 

    for character in text: 
     if character == "(": 
      s.push(character) 
     elif character == ")": 
      if s.is_empty(): 
       return False 
      else: 
       s.pop() 
     if character == "<": 
      s.push(character) 
     elif character == ">": 
      if s.is_empty(): 
       return False 
      else: 
       s.pop() 

    if s.is_empty(): 
     return True 
    else: 
     return False 

。なぜこれが正しいのか判断するのに助けが必要です。ありがとうございました。

+0

あなたがあなたのポップアップオープナーと実際に近い*が一致するかどうかはチェックしていません。 – user2357112

+0

オープナーがスタックに入っているかどうかを確認するにはどうすればいいですか? –

+0

elif "(" と のelif "<"を に入れましたが、スタックが反復可能ではないというエラーが表示されます。 –

答えて

1

私はおそらく、このようにして、どの閉じ括弧がどの括弧に属しているかをマップする辞書を使用します。この方法では、ブラケットタイプごとに1つではなく、ブロックを1つだけif/elifに単純化することができます。辞書にも大括弧を簡単に追加することができます。

# Map Closing to Opening 
BRACKETS = { 
    ')' : '(', 
    '>' : '<' 
} 

def balanced_brackets(text): 
    s = Stack() 
    for c in text: 
     # if opening bracket 
     if c in BRACKETS.values(): 
      s.push(c) 
     # if closing bracket 
     elif c in BRACKETS: 
      if s.is_empty(): 
       return False 
      # if opening bracket doesn't match closing bracket popped from Stack 
      elif BRACKETS[c] != s.pop(): 
       return False 

    return s.is_empty() 

# Output 
>>> balanced_brackets('(<x)>(())()') 
False 
>>> balanced_brackets('x<y)(>z') 
False 
>>> balanced_brackets('<(x)<y>)z') 
False 
>>> balanced_brackets('<((<<hello>>))>') 
True 
>>> balanced_brackets('<') 
False 
関連する問題