Engee 文档
Notebook

检查平衡括号

这个例子讨论了一个算法的实现,用于检查字符串中方括号的平衡,以及生成用于测试的随机括号序列。

导言

平衡括号验证算法是一个经典的编程问题,用于验证嵌套结构的正确性。 它用于分析表达式的语法,验证HTML/XML文档结构的正确性,以及其他需要匹配打开和关闭元素的情况。

在这种情况下,实施方括号序列的检查。 []. 该算法的工作原理如下:

  1. 当满足左括号 [ 计数器递增。
  2. 当满足右括号 ] 计数器正在减少。
  3. 如果计数器变为负数,则表示有一个额外的右括号,并且该字符串被认为是不正确的。
  4. 在行程结束时,计数器必须为零以获得正确的序列。

除了主验证功能外,还实现了随机序列生成功能 n 可用于测试算法的括号对。

In [ ]:
# Установка пакета Printf (если еще не установлен)
import Pkg; Pkg.add(["Printf", "Random"])
   Resolving package versions...
   Installed UnicodePlots ─ v3.8.1
    Updating `~/.project/Project.toml`
  [de0858da] + Printf v1.11.0
  No Changes to `~/.project/Manifest.toml`

主要部分

检查括号平衡的功能

功能 balancedbrackets(str) 接受字符串作为输入,并检查括号是否正确放置。 [].

工作的逻辑:

-每个左括号 [ 计数器递增 i.
-每次关闭 ] -它正在减少。
-如果计数器值变为负数,则表示遇到了额外的右括号,函数返回 false.
-查看行后,如果计数器值为零,括号平衡,则返回 true.

行为示例:

  • "[]"true
  • "]["false
  • "[[[]]]"true
  • "[]""]][["false
In [ ]:
# Подключение модуля Printf для форматированного вывода
using Printf
using Random

"""
Функция `balancedbrackets` принимает строку и проверяет,
сбалансированы ли в ней квадратные скобки.

Это делается путем подсчета:
- при встрече '[' увеличиваем счетчик (i += 1),
- при встрече ']' уменьшаем счетчик (i -= 1).
Если счетчик уходит в минус — слишком много закрывающих скобок.
В конце проверяем, что счетчик равен 0.
"""
function balancedbrackets(str::AbstractString)
    # Инициализируем счетчик
    i = 0
    
    # Проходим по каждому символу строки
    for c in str
        # Увеличиваем счетчик, если открытая скобка
        if c == '[' 
            i += 1 
        # Уменьшаем, если закрытая
        elseif c == ']' 
            i -= 1 
        end
        
        # Если счетчик стал отрицательным — лишняя закрывающая скобка
        if i < 0 
            return false 
        end
    end
    
    # Возвращаем true, только если все скобки нашли пару
    return i == 0
end
Out[0]:
balancedbrackets

随机括号序列生成函数

功能 brackets(n)n 成对的括号中的随机顺序。

它是如何工作的?

  • "[]" ^ n 创建字符串 "[[][]...]" (重复模式n次 [])
  • collect(...) 把它变成一个字符数组
  • shuffle(...) 随机洗牌的元素
  • join(...) 把所有的东西放在一起
In [ ]:
"""
Функция `brackets(n)` создает строку из n пар случайно перемешанных скобок '[' и ']'.
Сначала создается коллекция из n пар символов ("[]" repeated n times),
потом она преобразуется в массив символов и перемешивается функцией shuffle().
Затем результат объединяется в строку с помощью join().
"""
brackets(n::Integer) = join(shuffle(collect(Char, "[]" ^ n)))
Out[0]:
brackets

程序的主要逻辑:

对于从0到8的每个数字:

1. 生成一个随机的长度括号字符串 2*i (i 对)。

2. 函数被调用 balancedbrackets() 检查余额。

3. 结果以格式化格式显示:

-字符串本身

-验证结果 ("pass" / "fail").

In [ ]:
for (test, pass) in map(x -> (x, balancedbrackets(x)), collect(brackets(i) for i = 0:8))
    @printf "%22s %10s\n\n" test pass ? "pass" : "fail"
end
                             pass

                    []       pass

                  [][]       pass

                ][[]][       fail

              [[[][]]]       pass

            ][[][[[]]]       fail

          []]][[[[][]]       fail

        [][[[]][][][]]       pass

      []][[][]][[]][[]       fail

结论

我们回顾了Julia语言中检查方括号平衡的算法的实现和应用。

做了什么:
-实现了功能 balancedbrackets(),其中检查括号是否正确放置。
-已编写辅助函数 brackets(),它创建用于测试的随机括号字符串。
-对几个值进行了自动测试,并演示了输出。

此示例对于理解数据结构分析的原理非常重要,并且在处理解析器、语法检查和其他需要打开和关闭元素配对的任务时非常有用。

该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/Balanced_brackets