Изменения

Перейти к: навигация, поиск

Правильные скобочные последовательности

358 байт добавлено, 05:22, 15 января 2012
Нет описания правки
== Алгоритм проверки правильности скобочной последовательности ==
Пусть нам дана скобочная последовательность, записанная в строку $s$. Возьмем переменную $apointer$, $a pointer = 0$. Будем последовательно перебирать все символы этой строки. Если мы встречаем открывающуюся скобку, то увеличиваем $apointer$ на $1$, закрывающую - уменьшаем на $1$. Если на протяжении всего перебора $apointer$ было неотрицательным и после завершения осталось нулем, то скобочная последовательность правильна.
''псевдокод'':
return false
Надо отметить , что, скобочные последовательности могут состоять не только из одного типа скобок, при . При этом недопустимо такое расположение, когда один тип скобок закрывает другой:
''Примеры скобочных последовательностей с несколькими типами скобок:''
|definition =Числа Каталана {{---}} последовательность чисел, выражающих:
*количество не изоморфных упорядоченных бинарных деревьев с корнем и $n + 1$ листьями;
*количество способов соединения $2n$ точек на окружности $n $ не пересекающимися хордами;
*количество разбиений выпуклого $(n + 2)$ - угольника на треугольники не пересекающимися диагоналями;
*количество правильных скобочных последовательностей имеющих $n$ открывающихся скобок.}}
''Генерация следующей скобочной последовательности:''
Пусть нам известна строка $s$, представляющая собой правильную скобочную последовательность. Нам необходимо вывести следующую скобочную последовательность, а если ее нет, то - "No solution". Чтобы получить следующую скобочную последовательность надо найти минимальнуюпоследнюю открывающуюся скобку, которую можно заменить , заменить ее на закрывающуюся, а оставшиеся в конце скобки (если они есть) заменить на минимально возможную последовательность скобок:
next(s):
if (s[i] == '('):
pointer_open++
if (pointer_closed pointer_close > pointer_open)
break
else
pointer_closedpointer_close++ delete(s, length(s) - pointer_open - pointer_closed pointer_close + 1, pointer_closed pointer_close + l) if (s == ' '""):
return false
s = s +')'
for (j = 1; j > l < pointer_open + 1; j++):
s = s + '('
for (j = 1; j > pointer_closed< pointer_close; j++):
s = s + ')'
return true
Если эта функция после выполнения выводит $true$ , тогда надо напечатать полученную строку $s$, если $false$, то следует вывести "No solution".
''Получение лексикографического порядка:''
order (n)
s = ' '"";
if (n == 0):
result(s)
94
правки

Навигация