profile
Опубликовано 5 лет назад по предмету Информатика от Аккаунт удален

Текст (например, арифметическое выражение) содержит многократно вложенные круглые скобки. Исправить его, оставив скобки первого уровня круглыми, второго – заменить на квадратные, третьего и последующих – на фигурные. Убедиться в корректности использования скобок.

Пример. ln(sin((a+b)c-d)) заменить выражением ln{sin[(a+b)c-d]}.

  1. Ответ
    Ответ дан archery
    //PascalABC.NET 3.1 сборка 1239
    var
        brackets: array [0..2, 0..1] of char := (('{', '}'), ('[', ']'), ('(', ')'));

    begin
        var s := ReadlnString();
        var counter := 0;
        var max_depth := 0;
        
        for var i := 1 to s.Length do
        begin
            if s[i] = '(' then counter += 1
            else if s[i] = ')' then counter -= 1
            else continue;
            if counter < 0 then begin
                writeln('brackets error');
                Halt;
            end;
            if counter > max_depth then max_depth := counter;
        end;
        
        counter := 0;
        for var i := 1 to s.Length do
        begin
            if s[i] = '(' then counter += 1
            else if s[i] = ')' then counter -= 1
            else continue;
            
            if (counter = max_depth - 1) and (s[i] = '(') then s[i] := brackets[1, 0]
            else if (counter = max_depth - 2) and (s[i] = ')') then s[i] := brackets[1, 1]
            else if (counter = max_depth - 2) and (s[i] = '(') then s[i] := brackets[0, 0]
            else if (counter = max_depth - 3) and (s[i] = ')') then s[i] := brackets[0, 1];
        end;
        
        writeln(s);
    end.

    1. Ответ
      Ответ дан archery
      не буду утверждать что решение оптимальное но рабботает
Самые новые вопросы