otwarte = '([{<'
zamkniete = ')]}>'

# sprawdza czy nawias jest otwarty
def czyOtwarty(nawias):
    return nawias in otwarte

# sprawdza czy nawias jest zamkniety
def czyZamkniety(nawias):
    return nawias in zamkniete

# sprawdza czy indeksy nawiasow otwartego i zamknietego sa takie same '(' = 0, '[' = 1, ...
def czyPasuja(otwarty, zamkniety):
    return otwarte.index(otwarty) == zamkniete.index(zamkniety)

# funkcja sprawdzajaca, nawiasy i stos do odkladania nawiasow (string, string)
def czyNawiasyPasuja(nawiasy, stos):
    # czy nawiasy sa puste, C++ nawiasy.isEmpty()
    if len(nawiasy) == 0:
        # zwraca czy stos pusty, C++ stos.isEmpty()
        return len(stos) == 0
    # czy nawias pierwszy jest otwarty
    elif czyOtwarty(nawiasy[0]):
        # szuka zamknietych nawiasow bez tego pierwszego, odkladajac ten otwarty na stos
        return czyNawiasyPasuja(nawiasy[1:], nawiasy[0] + stos)
    # czy nawias pierwszy zamkniety
    elif czyZamkniety(nawiasy[0]):
        # czy stos nie pusty i czy uzgodnilo nawiasy i czy obciete nawiasy i stos pasuja
        return (len(stos) != 0) and czyPasuja(stos[0], nawiasy[0]) and czyNawiasyPasuja(nawiasy[1:], stos[1:])
    else:
        # inaczej gdy napotka inny znak szuka dalej
        return czyNawiasyPasuja(nawiasy[1:], stos)

testy = ['([()]())()', '(()[()])()', '(()())[()]', '([()()])()', '[(()())]()', '[(()())()]']
for test in testy:
    print(test + ' = ' + str(czyNawiasyPasuja(test, '')))

'''
    test = '([()]())()'
    
    czyNawiasyPasuja('([()]())()', '')
      czyOtwarty('(')
      czyNawiasyPasuja('[()]())()', '(')
        czyOtwarty('[')
        czyNawiasyPasuja('()]())()', '[(')
          czyOtwarty('(')
          czyNawiasyPasuja(')]())()', '([(')
            czyZamkniety(')')
            czyNawiasyPasuja(']())()', '[(')
              czyZamkniety(']')
              czyNawiasyPasuja('())()', '(')
                czyOtwarty('(')
                czyNawiasyPasuja('))()', '((')
                  czyZamkniety(')')
                  czyNawiasyPasuja(')()', '(')
                    czyZamkniety(')')
                    czyNawiasyPasuja('()', '')
                      czyOtwarty('(')
                      czyNawiasyPasuja(')', '(')
                        czyZamkniety(')')
                        czyNawiasyPasuja('', '')
                          '' == 0
                        True
                      True
                    True
                  True
                True
              True
            True
          True
        True
      True
    True
'''