@igoodmood

Где ошибка в коде, написанного на Python?

Создал программу-фильтр для проверки тэгов HTML документа. Но при проверке обнаружил, что правильные выражения для проверки она отмечает как неправильные. Менял фрагменты кода, но это не помогает. Помогите, пожалуйста, где именно ошибка?
class Stack:
    def __init__(self):
        self.item = []
    def push(self,item):
        self.item.append(item)
    def pop(self):
        return self.item.pop()
    def isEmpty(self):
        return self.item==[]
    def size(self):
        return len(self.item)
s=Stack()
def html(tag):
    balanced= True
    index=0
    tag1=0
    tag2=0
    while index<len(tag) and balanced:
        symbol=tag[index]
        if symbol=="<":
            s.push(symbol)
        elif symbol==">" :
            s.push(symbol)
        else:
            if s.isEmpty():
                balanced=False
            else:
                s.pop()
        index=index+1         
    if balanced and s.isEmpty() :
        return True
    else:
        return False
print(html('</html> </body> ,This is html! <body> </title> <title> </head> <head> <html>'))     
print(html('<>title</>'))
  • Вопрос задан
  • 553 просмотра
Решения вопроса 1
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
На первой же строке вы затолкнули '<' затем вытолкнули на '/', и на следующей итерации у вас balanced=False, потому что стек пуст. И далее в цикле значение balanced уже не меняется.

Я не видел ТЗ, но проверить баланс по скобочкам можно например так:
class Stack:
    def __init__(self):
        self.item = []

    def push(self,item):
        self.item.append(item)

    def pop(self):
        return self.item.pop()

    def isEmpty(self):
        return self.item==[]

    def size(self):
        return len(self.item)



def html(tag):
    s = Stack()
    for symbol in tag:
        if symbol == "<":
            s.push(symbol)
        elif symbol == ">" and s.isEmpty():
            return False
        elif symbol == ">":
            s.pop()       
    return True if s.isEmpty() else False


if __name__ == '__main__':
    print(html('</html> </body> ,This is html! <body> </title> <title> </head> <head> <html>'))     
    print(html('<>title</>'))
    print(html('</html> </body ,This is html! <body> </title> <title> </head> <head> <html>'))
    print(html('>/html< </body> ,This is html! <body> </title> <title> </head> <head> <html>'))
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Maxim_Samburskiy
То же самое можно сделать проще:
count = 0
for symbol in tag:
    if symbol == "<":
        count += 1
    elif symbol == ">":
        count -= 1
return count == 0
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы