Проверить, содержит ли строка правильную скобочную запись - 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).
- Комментарии к коду описывают, что делает каждый блок кода.
- Комментарии начинаются с символа '//', а затем идет описание кода.
- Комментарии не влияют на работу программы, так как они игнорируются компилятором.
- Комментарии используются для пояснения кода и его отладки.
- Комментарии могут быть использованы для документирования кода и описания его функциональности.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д