Проверить, содержит ли строка правильную скобочную запись - PascalABC.NET
Формулировка задачи:
Дана символьная строка, содержащая скобки четырех видов ( {}, [], () и <> ) и заканчивающаяся точкой. Напишите рекурсивную функцию, проверяющую, содержит ли эта строка правильную скобочную запись.
Подскажите как делать, рекурсия никак не дается для осознания.
Решение задачи: «Проверить, содержит ли строка правильную скобочную запись»
textual
Листинг программы
Function Check(s : String) : Boolean; Const c = '{}[]()<>'; Var k : Integer; f : Boolean; Begin If s[1]<>#0 then Begin If Pos('.',s)>0 then s:=Copy(s,1,Pos('.',s)); {укорачиваем до точки} For k:=Length(s) downto 1 do If Pos(s[k],c)=0 then Delete(s,k,1); s:=#0+s; end; f:=False; For k:=1 to Length(c) div 2 do If Pos(Copy(c,k*2-1,2),s)>0 then Begin Delete(s,Pos(Copy(c,k*2-1,2),s),2); f:=True; end; Check:=f and ((Length(s)=1) or Check(s)); end; Var St : String; Begin // Readln(St); // Writeln(Check(St)); Writeln(Check('0[0(0)0]0.[(')); {True} Writeln(Check('0[0(0)0<0>0].)))[[[')); {True} Writeln(Check('[(0)<0>]{.')); {False} Writeln(Check('[0()<0>]{}[')); {False} Writeln(Check('[0()<0>]{}0(<0>).]>')); {True} end.
Объяснение кода листинга программы
- В функции Check(s: String) : Boolean происходит проверка строки s на правильную скобочную запись.
- Если первый символ строки s не равен символу конца строки (#0), то выполняется следующий блок кода.
- Если в строке s есть точка (Pos('.',s) > 0), то строка укорачивается до точки (s := Copy(s,1,Pos('.',s))).
- Далее, в цикле For, проверяется каждый символ строки s на наличие в константе c ('.' + '{}[]()<>').
- Если символ найден, то он удаляется из строки s (Delete(s,Pos(Copy(c,k*2-1,2),s),2)).
- Флаг f устанавливается в True, если найден хотя бы один символ из константы c.
- После цикла For, флаг f проверяется на равенство True и в случае положительного результата, функция возвращает True.
- Если длина строки s равна 1, то функция возвращает True.
- В противном случае, вызывается рекурсивный вызов функции Check(s).
- В основной части кода, функция Check вызывается для различных тестовых строк.
- Для первой тестовой строки '0[0(0)0]0.[(') функция возвращает True, так как все символы из константы c присутствуют в строке и в правильном порядке.
- Для второй тестовой строки '0[0(0)0<0>0].)))[[[', функция также возвращает True, так как все символы из константы c присутствуют в строке и в правильном порядке.
- Для третьей тестовой строки '[(0)<0>]{}.'), функция возвращает False, так как закрывающая скобка ')' находится перед открывающей скобкой '(' и это не допустимо.
- Для четвертой тестовой строки '[0()<0>]{}0(<0>).]>'), функция также возвращает True, так как все символы из константы c присутствуют в строке и в правильном порядке.
- В основной части кода, после вызова функции Check для каждой тестовой строки, выводится результат проверки (True или False).
- Комментарии к коду описывают, что делает каждый блок кода.
- Комментарии начинаются с символа '//', а затем идет описание кода.
- Комментарии не влияют на работу программы, так как они игнорируются компилятором.
- Комментарии используются для пояснения кода и его отладки.
- Комментарии могут быть использованы для документирования кода и описания его функциональности.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д