Здравствуйте, дамы и господа!
Недавно столкнулся с проблемой разбора строки, где нужно было определить, правильно ли с математической точки зрения расставлены скобки. То есть, у нас имеется строка, которую надо распарсить и на основе ее анализа, выдать сообщение о правильности или неправильности данного выражения.
На данную тему написано огромное количество статей, начинать можно с алгоритма Рутисхаузера, но все это достаточно сложно и мало информации о реализации данных методов. Поэтому пришлось написать все самому, что оказалось достаточно просто и, я думаю, под силу каждому.
И так, имеем строку "(a+b)/c" - должны вернуть true, так как все расставлено верно, "((a/b)(" - должны вернуть false, так как скобки расставлены некорректно. Код будем писать на C#.
Приступим к написанию конструктора нашего класса:
Главная идея следующая: мы проходим по строке и последовательно ее анализируем, занося в специально созданный массив число -1, в том случае, если нам встретится символ '(' и число 1, если встретим ')'.
В
дальнейшем мы будем проходить по массиву и удалять рекурсивно i-1- й и
i-й элементы, если i-1-й элемент равен -1 и i-й элемент равен 1.
В заключение, предоставим свойство, позволяющее получить результат анализа переданного на анализ выражения:
Собственно, теперь в нашем распоряжении имеется полностью работоспособный класс, способный анализировать правильную расстановку скобок в строке. Осталось протестировать его.
Тестирование нашей программы:
Ну вот и все, обсуждение и усовершенствование программы только приветствуется!
Комментариев нет:
Отправить комментарий