Проверить, содержит ли строка правильную скобочную запись - 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.

Объяснение кода листинга программы

  1. В функции Check(s: String) : Boolean происходит проверка строки s на правильную скобочную запись.
  2. Если первый символ строки s не равен символу конца строки (#0), то выполняется следующий блок кода.
  3. Если в строке s есть точка (Pos('.',s) > 0), то строка укорачивается до точки (s := Copy(s,1,Pos('.',s))).
  4. Далее, в цикле For, проверяется каждый символ строки s на наличие в константе c ('.' + '{}[]()<>').
  5. Если символ найден, то он удаляется из строки s (Delete(s,Pos(Copy(c,k*2-1,2),s),2)).
  6. Флаг f устанавливается в True, если найден хотя бы один символ из константы c.
  7. После цикла For, флаг f проверяется на равенство True и в случае положительного результата, функция возвращает True.
  8. Если длина строки s равна 1, то функция возвращает True.
  9. В противном случае, вызывается рекурсивный вызов функции Check(s).
  10. В основной части кода, функция Check вызывается для различных тестовых строк.
  11. Для первой тестовой строки '0[0(0)0]0.[(') функция возвращает True, так как все символы из константы c присутствуют в строке и в правильном порядке.
  12. Для второй тестовой строки '0[0(0)0<0>0].)))[[[', функция также возвращает True, так как все символы из константы c присутствуют в строке и в правильном порядке.
  13. Для третьей тестовой строки '[(0)<0>]{}.'), функция возвращает False, так как закрывающая скобка ')' находится перед открывающей скобкой '(' и это не допустимо.
  14. Для четвертой тестовой строки '[0()<0>]{}0(<0>).]>'), функция также возвращает True, так как все символы из константы c присутствуют в строке и в правильном порядке.
  15. В основной части кода, после вызова функции Check для каждой тестовой строки, выводится результат проверки (True или False).
  16. Комментарии к коду описывают, что делает каждый блок кода.
  17. Комментарии начинаются с символа '//', а затем идет описание кода.
  18. Комментарии не влияют на работу программы, так как они игнорируются компилятором.
  19. Комментарии используются для пояснения кода и его отладки.
  20. Комментарии могут быть использованы для документирования кода и описания его функциональности.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.8 из 5
Похожие ответы