2017-01-23 12 views
1

私は括弧ie {} []()のユーザー入力を受け取り、それらがペア(開閉)を持っているかどうかを確認するプログラムを書いています。私は私のコードを実行する際にエラーに遭遇しています。私は常に戻り値をfalseにします。私は事前に設定された "リスト"をチェックするさまざまな方法を試しましたが、うまくいかないようです。私は上記のクラスを使用する必要があります。どんな助けもありがとう。Pythonはユーザー入力からの括弧を比較し、ペアがあることを確認します

いくつかの例の入力は、次のとおりです。

>>>parenthesesMatch('{[]}') 
    True 
    >>>parenthesesMatch('({})') 
    True 
    >>>parenthesesMatch('{[)]}') 
    False 

マイコード:

#George flamburis 


class Stack(): 
def __init__(self,que=[]): 
    self.lst = que 
def __repr__(self): 
    return "Stack({})".format(self.lst) 
def push(self, add): 
    self.lst.append(add) 
def pop(self): 
    return self.lst.pop() 
def isEmpty(self): 
    return self.lst==[] 
def first(self, loc=0):   #naming of this method can't be [] 
    return self.lst[loc] 
def len(self): 
    return len(self.lst) 

def parenthesesMatch(match): 
    s = Stack() 
    end = [] 
    for char in match: 
     if char in "[ { (": 
      s.push(char) 
     else: 
      end.append(char) 

    if s.len()==len(end): 
      for num in range(len(end)): 
        if s.first(num) and end[num] not in '[]' or '{}' or'()': 
          return False 
      return True 
    elif s.len()!=len(end): 
      return False 
+0

ご質問はありますか? あなたのコードはPython 2.7で動作していません。かっこのマッチ(マッチ)には自分がいませんか? –

答えて

6

それは単にあなたが1を見たときにスタックから終了文字をポップしようとすると、そのISN場合に失敗する方がはるかに簡単です可能です。

pairs = dict(tuple(pair) for pair in ["()", "[]", "{}"]) 
# pairs["("] == ")" 
# pairs["["] == "]" 
# etc 
def parenthesesMatch(match): 
    s = Stack() 
    for char in match: 
     # Not "] })" 
     if char in pairs.values() and pairs[s.pop()] != char: 
      return False 
     elif char in pairs: 
      s.push(char) 
    return s.isEmpty() 
+0

この関数の実装は、 '[{}]'や '{}()'のような単純な入力では失敗します。 –

+0

ありがとうございます。私は、リテラルな文字の一致ではなく、一致するペアを探していたことを忘れています。 – chepner

+0

私はこれが最も簡単な解決策だと思います。 –

-2
def parenthesesMatch(match): 
    counter = {'{': 0, '[': 0, '(': 0, '}': 0, ']': 0, ')': 0} 
    parantheses = '{}[]()' 
    for character in match: 
     if character not in parantheses: 
      continue 

     counter[character] += 1 
    return (counter['{'] == counter['}']) and (counter['['] == counter[']']) and (counter['('] == counter[')']) 
+0

これは、各タイプの文字列内の量が同じであればtrueを返します。したがって、 '[{]}'などの入力は、 '['と ']'と '{'と '} 'が一致しているため真と評価されます。 –

1
def match(par): 
    combs = {'{': '}', '(': ')', '[': ']'} 
    stack = [] 
    for char in par: 
     if char in '[{(': 
      stack.append(char) 
     elif char == combs[stack[len(stack) - 1]]: 
      stack.pop() 
     else: 
      return False 
    return len(stack) == 0 
+0

par = '[[['? –

+0

@NikolayProkopyevを修正しました。それを指摘してくれてありがとう –

0

コメントは、私の考えを概説します。

def isParenthesesMatch(s): 
    # to be balanced should be divisable by 2 
    if len(s)%2 != 0: 
     return False 
    open_paren = ['(','[','{'] 
    open_paren_stack = list() 
    match_close_paren = {')' : '(',']': '[', '}' : '{'} 
    for item in s: 
     #Don't care about open 
     if item in open_paren: 
      open_paren_stack.append(item) 
     #if closed we should be able to pop 
     elif len(open_paren_stack) == 0: 
      return False 
     #if we can pop it should match up 
     elif open_paren_stack.pop() != match_close_paren[item]: 
      return False 
    #in case we push a bunch of open and then end with balanced pair  
    return len(open_paren_stack) == 0 
関連する問題