2015-05-06 3 views
1

Я написал следующий код, чтобы проверить, если входные функции содержит сбалансированные скобки:Функция, которая проверяет, является ли скобки сбалансированы в питона

def balanced_brackets(text): 
    brackets = [ ('(',')'), ('[',']'), ('{','}'),('<','>')] 
    s = 0 
    e = 1 
    st = Stack() 

    for i in text: 
     for pair in brackets: 
      if i == pair[s]: 
       st.push(i) 
      elif i == pair[e] and not st.isEmpty() and st.pop() != pair[s]: 
       return False 

    if st.isEmpty(): 
     return True 
    else: 
     return False 

Этот код работает для ввода, такие как «() (())(), но это не удалось, когда я попробовал его для «zn() ((b)()) q())() l() d (r) '. Может ли кто-нибудь помочь мне определить, в чем проблема? Благодарю.

+0

@wickstopher И функция возвращает True вместо False, поскольку она не сбалансирована. – ASm

ответ

3

Ваша проблема с and not st.isEmpty()==0. Когда он добирается до неуравновешенного ')', все предыдущие уравновешивают, поэтому st - пустой.

  1. Если у вас есть пара i == [e], и ​​ваш стек пуст, вы хотите вернуть False.
  2. Вы также хотите вернуть False, если вы поп, и это не пара [e]. Но вы не хотите появляться, если стек пуст.

Что у вас сейчас, в состоянии 1, просто продолжается. Вы должны изменить вокруг условия там, чтобы он учитывал оба, или иметь два elifs. Первый может быть достигнут с помощью некоторых гнезд и т. Д.

Кстати, если вы не хотите что-то делать с этим, нет реальной потребности в реализации стека. Вместо этого вы можете использовать список с l.pop, len (l) и l.append.

+0

А это была проблема, я только что исправил ее, спасибо! – ASm

+0

@ASm вы должны принять этот ответ –

+1

@jon_darkstar done :) – ASm

Смежные вопросы