如何对花括号和 open/closed 括号进行排序?

How can I sort curly- and open/closed brackets?

我的老师要我对随机数量的括号进行排序。 我试图自己解决这个问题...但是,我发现我的解决方案很糟糕,希望有人有更好的主意。

该字符串只包含这些字符:()[]{} ... 所以首先我检查了字符串的长度,然后让 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.

正如我所说 - 我得到了想要的结果...但我认为它执行得不好。 但是我找不到更好的解决方案。

希望你能帮助我 - 谢谢!

变量是全局的,所以会被初始化为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.

改进后的版本也可以处理比每种括号三个更多的数字。