Pascal 如何对花括号和开/闭括号进行排序?

Pascal 如何对花括号和开/闭括号进行排序?,pascal,Pascal,我的老师想让我对任意数量的括号进行排序。 我试图自己解决这个问题。。。然而,我发现我的解决方案不好,希望有人有更好的想法 字符串仅包含以下字符:()[]{}。。。 因此,首先我检查了字符串的长度,然后让case语句对每个字符进行计数,以将数字保存在变量中。 之后,我使用变量中的值来获得想要的输出 program counter; uses SysUtils, crt; var character: String; k1_open,k2_open,k3_open,k1_closed,k

我的老师想让我对任意数量的括号进行排序。 我试图自己解决这个问题。。。然而,我发现我的解决方案不好,希望有人有更好的想法

字符串仅包含以下字符:()[]{}。。。 因此,首先我检查了字符串的长度,然后让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.
示例:





正如我所说的-我有想要的结果。。。但我认为它执行得很糟糕。 但我找不到更好的解决办法


我希望你能帮助我-谢谢

变量是全局变量,因此它们将被初始化为0,否则,您可能需要将k1_open等设置为0

您可以这样改进代码:

如果(k1_打开=1)和(k1_关闭=1),则开始
写(“()”);
如果(k1_打开=2)和(k1_关闭=2),则结束else,然后开始
写(“()”);
如果(k1_打开=3)和(k1_关闭=3),则结束else,然后开始
写(“()”);
结束;
如果(k2_打开=1)和(k2_关闭=1),则开始
写入(“[]”);
如果(k2_打开=2)和(k2_关闭=2),则结束else,然后开始
写入(“[]”);
如果(k2_打开=3)和(k2_关闭=3),则结束else,然后开始
写入(“[]”);
结束;
如果(k3_打开=1)和(k3_关闭=1),则开始
写({}');
如果(k3_打开=2)和(k3_关闭=2),则结束else,然后开始
写('{}{}');
如果(k3_打开=3)和(k3_关闭=3),则结束else,然后开始
写('{}{}}');
结束;
变成类似于:

if(k1_打开=k1_关闭)和
(k2_打开=k2_关闭)和
(k3_打开=k3_关闭)然后
开始
对于i:=1至k1_开放do
写(“()”);
对于i:=1至k2_开放do
写入(“[]”);
对于i:=1至k3_开放do
写({}');
书面语;
结束
其他的
Writeln('括号不匹配')
结束。

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

这些变量是全局变量,因此它们将被初始化为0,否则,您可能需要将k1_open等设置为0

您可以这样改进代码:

如果(k1_打开=1)和(k1_关闭=1),则开始
写(“()”);
如果(k1_打开=2)和(k1_关闭=2),则结束else,然后开始
写(“()”);
如果(k1_打开=3)和(k1_关闭=3),则结束else,然后开始
写(“()”);
结束;
如果(k2_打开=1)和(k2_关闭=1),则开始
写入(“[]”);
如果(k2_打开=2)和(k2_关闭=2),则结束else,然后开始
写入(“[]”);
如果(k2_打开=3)和(k2_关闭=3),则结束else,然后开始
写入(“[]”);
结束;
如果(k3_打开=1)和(k3_关闭=1),则开始
写({}');
如果(k3_打开=2)和(k3_关闭=2),则结束else,然后开始
写('{}{}');
如果(k3_打开=3)和(k3_关闭=3),则结束else,然后开始
写('{}{}}');
结束;
变成类似于:

if(k1_打开=k1_关闭)和
(k2_打开=k2_关闭)和
(k3_打开=k3_关闭)然后
开始
对于i:=1至k1_开放do
写(“()”);
对于i:=1至k2_开放do
写入(“[]”);
对于i:=1至k3_开放do
写({}');
书面语;
结束
其他的
Writeln('括号不匹配')
结束。

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

首先,将所有
k
-变量设置为零。不要测试
打开
/
关闭
计数为1,2,3等,而是测试是否相等。然后在循环中使用count变量打印括号数。首先,将所有
k
-变量设置为零。不要测试
打开
/
关闭
计数为1,2,3等,而是测试是否相等。然后在循环中使用count变量打印括号数。
Input: [{])]}(

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

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

Output: Error - brackets do not match.