среда, 17 октября 2012 г.

Анализ строки на корректность расставления в ней скобок.


Здравствуйте, дамы и господа!

Недавно столкнулся с проблемой разбора строки, где нужно было определить, правильно ли с математической точки зрения расставлены скобки. То есть, у нас имеется строка, которую надо распарсить и на основе ее анализа, выдать сообщение о правильности или неправильности данного выражения.



На данную тему написано огромное количество статей, начинать можно с алгоритма Рутисхаузера, но все это достаточно сложно и мало информации о реализации данных методов. Поэтому пришлось написать все самому, что оказалось достаточно просто и, я думаю, под силу каждому.

И так, имеем строку "(a+b)/c" - должны вернуть true, так как все расставлено верно, "((a/b)(" - должны вернуть false, так как скобки расставлены некорректно. Код будем писать на C#.

Приступим к написанию конструктора нашего класса:


Главная идея следующая: мы проходим по строке и последовательно ее анализируем, занося в специально созданный массив число -1, в том случае, если нам встретится символ '(' и число 1, если встретим ')'.  

В дальнейшем мы будем проходить по массиву и удалять рекурсивно i-1- й  и i-й элементы, если i-1-й элемент равен -1 и i-й элемент равен 1.


В заключение, предоставим свойство, позволяющее получить результат анализа переданного на анализ выражения:

  
Собственно, теперь в нашем распоряжении имеется полностью работоспособный класс, способный анализировать правильную расстановку скобок в строке. Осталось протестировать его.


Тестирование нашей программы



Ну вот и все, обсуждение и усовершенствование программы только приветствуется!

Комментариев нет:

Отправить комментарий