pascal - 如何对大括号和开/关括号进行排序?
问题描述
我的老师要我对随机数量的括号进行排序。我试图自己解决这个问题......但是,我发现我的解决方案很糟糕,希望有人有更好的主意。
字符串只包含这些字符: ()[]{} ... 所以首先我检查了字符串的长度,然后让 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.
改进的版本也可以处理大于三个的每种括号的数量。
推荐阅读
- .net - WNetAddConnection2 引发拒绝访问错误
- javascript - 没有元标记的响应式网页?
- c - 来自 Windows 10 命令提示符的程序集-c
- docker - 从 Jenkins docker 容器连接到 localhost 从节点
- java - 将输入 \t 返回为 * 的程序
- android - 如何将 Json 数组转换为 List
? - css - 背景图像上的 CSS 曲线
- android-studio - 如何在 TabLayout 内的片段中更新 RecyclerView
- forms - 如何恢复最小化的模态形式?
- reactjs - 如何让第一个孩子使用 JSS-Nested