Сообщество Engee

Сбалансированные скобки

Автор
avatar-maximsidorovmaximsidorov
Notebook

Проверка сбалансированных скобок

В данном примере рассматривается реализация алгоритма проверки сбалансированности квадратных скобок в строке, а также генерация случайных последовательностей скобок для тестирования.

Введение

Алгоритм проверки сбалансированных скобок — это классическая задача в программировании, которая используется для проверки корректности вложенных структур. Он применяется при анализе синтаксиса выражений, проверке корректности структуры HTML/XML-документов и в других случаях, где требуется соответствие открывающих и закрывающих элементов.

В данном случае реализована проверка последовательности квадратных скобок [ и ]. Алгоритм работает следующим образом:

  1. При встрече открывающей скобки [ счетчик увеличивается.
  2. При встрече закрывающей скобки ] счетчик уменьшается.
  3. Если счетчик становится отрицательным, это означает наличие лишней закрывающей скобки, и строка считается некорректной.
  4. По завершении прохода по строке счетчик должен быть равен нулю для корректной последовательности.

Помимо основной функции проверки, реализована функция генерации случайной последовательности из n пар скобок, которую можно использовать для тестирования алгоритма.

# Установка пакета 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
# Подключение модуля 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
balancedbrackets

Функция генерации случайных скобочных последовательностей

Функция brackets(n) генерирует строку из n пар скобок в случайном порядке.

Как это работает?

  • "[]" ^ n создаёт строку "[[][]...]" (n раз повторённый шаблон [])
  • collect(...) превращает её в массив символов
  • shuffle(...) произвольно перемешивает элементы
  • join(...) снова собирает всё в одну строку
"""
Функция `brackets(n)` создает строку из n пар случайно перемешанных скобок '[' и ']'.
Сначала создается коллекция из n пар символов ("[]" repeated n times),
потом она преобразуется в массив символов и перемешивается функцией shuffle().
Затем результат объединяется в строку с помощью join().
"""
brackets(n::Integer) = join(shuffle(collect(Char, "[]" ^ n)))
brackets

Основная логика программы:

Для каждого числа от 0 до 8:

1. Генерируется случайная строка скобок длины 2*i (i пар).

2. Вызывается функция balancedbrackets() для проверки баланса.

3. Результат выводится в форматированном виде:

- сама строка

- результат проверки ("pass" / "fail").

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 Code