Сбалансированные символы (общий случай)¶
Показанная выше задача о сбалансированных скобках является частным случаем более общей ситуации, возникающей во многих языках программирования. Обобщённая проблема балансировки и вложенности различных типов открывающих и закрывающих символов возникает очень часто. Например, в Python квадратные скобки, [ и ], используются для списков, фигурные скобки, { и }, - для словарей, а круглые (( и )) - для кортежей и арифметических выражений. Можно сколько угодно перемешивать символы до тех пор, пока каждый из них поддерживает свои открывающие и закрывающие отношения. Для строк вроде
{ { ( [ ] [ ] ) } ( ) }
[ [ { { ( ( ) ) } } ] ]
[ ] [ ] [ ] ( ) { }
“хорошая сбалансированность” заключается не только в том, что каждый открывающий символ имеет соответствующий закрывающий, но и в совпадении типов этих символов.
Сравните верхний пример со следующими несбалансированными строками:
( [ ) ]
( ( ( ) ] ) )
[ { ( ) ]
Простой контролёр скобок из предыдущего раздела может быть легко расширен для обработки этих новых типов символов. Напомним, что каждый открывающий символ просто помещается в стек в ожидании появления в последовательности соответствующего закрывающего символа. Когда это происходит, единственная разница в том, что мы должны проверить, корректна ли связь с типом символа на вершине стека. Если они не соответствуют друг другу, то строка не сбалансирована. Аналогично, если вся входная последовательность обработана и стек пуст, то строка сбалансирована правильно.
Реализующая это программа на Python показана в ActiveCode 5. Единственное изменение коснулось строки 16, где вызывается вспомогательная функция matches, помогающая с соотнесением символов. Каждый символ, удаляемый из стека, должен быть проверен, чтобы убедиться, что он верно сопоставляется с текущим закрывающим символом. Если возникает ошибка, то булева переменная balanced устанавливается в False
Эти два примера показывают, что стеки - очень важная структура данных для обработки языковых конструкций в информатике. Практически любая нотация, о которой вы можете подумать, имеет некоторый тип вложенных символов, которые должны согласовываться между собой сбалансированным образом. Кроме вышеизложенного, есть целый ряд других важных применений стеков в области информатики. Мы продолжим их исследовать в следующем разделе.