首页 > 解决方案 > 如何对大括号和开/关括号进行排序?

问题描述

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

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

正如我所说 - 我有想要的结果......但我认为它的实施很糟糕。但我找不到更好的解决方案。

我希望你能帮助我-谢谢!

标签: pascal

解决方案


这些变量是全局的,因此它们将被初始化为 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.

改进的版本也可以处理大于三个的每种括号的数量。


推荐阅读