Как отсортировать фигурные и открытые / закрытые скобки? - PullRequest
1 голос
/ 15 апреля 2019

мой учитель хочет, чтобы я отсортировал случайное количество скобок. Я пытался решить эту проблему сам ... Однако, я считаю свое решение плохим и надеюсь, что у кого-то есть идея получше

Строка содержит только эти символы: () [] {} ... Итак, прежде всего я проверил длину строки, а затем сделал так, чтобы оператор case подсчитывал каждый символ, чтобы сохранить число в переменных. После этого я использовал значение в переменных, чтобы получить желаемый результат.

program counter;

uses SysUtils, crt;

var
  character: String;
  k1_open,k2_open,k3_open,k1_closed,k2_closed,k3_closed : Integer;
  i : Integer;

begin
    writeln('sort brackets (1. Version)');
    write('Input: ');readln(character);

    for i := 1 to length(character) do
    begin
        case character[i] of
        '(' : k1_open    :=  k1_open + 1;
        '[' : k2_open    :=  k2_open + 1;
        '{' : k3_open    :=  k3_open + 1;
        ')' : k1_closed  :=  k1_closed + 1;
        ']' : k2_closed  :=  k2_closed + 1;
        '}' : k3_closed  :=  k3_closed + 1;
        end;
    end;

    if (k1_open = 1) and (k1_closed = 1) then begin
        write('()');
    end else if (k1_open = 2) and (k1_closed = 2) then begin
        write('()()');
    end else if (k1_open = 3) and (k1_closed = 3) then begin
        write('()()()');
    end;

    if (k2_open = 1) and (k2_closed = 1) then begin
        write('[]');
    end else if (k2_open = 2) and (k2_closed = 2) then begin
        write('[][]');
    end else if (k2_open = 3) and (k2_closed = 3) then begin
        write('[][][]');
    end;

    if (k3_open = 1) and (k3_closed = 1) then begin
        write('{}');
    end else if (k3_open = 2) and (k3_closed = 2) then begin
        write('{}{}');
    end else if (k3_open = 3) and (k3_closed = 3) then begin
        write('{}{}{}');
    end;
end.

Примеры:


Input: [{])]}(

Output: {}[]()

Input: [(}{[])}(]{)

Output:{}{}[][]()()

Input: [][}}](

Output: Error - brackets do not match.

Как я уже сказал - у меня есть желаемый результат ... но я думаю, что он плохо реализован. Но я не мог найти лучшего решения.

Надеюсь, вы мне поможете - спасибо!

1 Ответ

0 голосов
/ 16 апреля 2019

Переменные являются глобальными, поэтому они будут инициализированы равными 0, но в противном случае вы можете установить k1_open и т. Д. На 0.

Вы можете улучшить код следующим образом:

    if (k1_open = 1) and (k1_closed = 1) then begin
        write('()');
    end else if (k1_open = 2) and (k1_closed = 2) then begin
        write('()()');
    end else if (k1_open = 3) and (k1_closed = 3) then begin
        write('()()()');
    end;

    if (k2_open = 1) and (k2_closed = 1) then begin
        write('[]');
    end else if (k2_open = 2) and (k2_closed = 2) then begin
        write('[][]');
    end else if (k2_open = 3) and (k2_closed = 3) then begin
        write('[][][]');
    end;

    if (k3_open = 1) and (k3_closed = 1) then begin
        write('{}');
    end else if (k3_open = 2) and (k3_closed = 2) then begin
        write('{}{}');
    end else if (k3_open = 3) and (k3_closed = 3) then begin
        write('{}{}{}');
    end;

в нечто вроде:

    if (k1_open = k1_closed) and
       (k2_open = k2_closed) and
       (k3_open = k3_closed) then 
    begin
      for i := 1 to k1_open do 
        Write('()');
      for i := 1 to k2_open do 
        Write('[]');
      for i := 1 to k3_open do 
        Write('{}');
      Writeln;
    end 
    else
      Writeln('Brackets do not match')
  end.

Улучшенная версия может обрабатывать большее число, чем три скобки каждого типа.

...