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