В мире программирования и анализа текстов среди нас могут скрываться различные задачи, одной из которых является определение правильности последовательности скобок. Данная задача возникает во множестве контекстов: от проверки синтаксиса программного кода до анализа математических выражений и текстовых данных. Эффективное решение этой задачи имеет критическое значение для обеспечения корректной работы программ и безопасности данных. В этой статье мы рассмотрим реализацию программы определения правильности последовательности скобок.
Теория
Алгоритм для определения правильности последовательности скобок, таких как круглые «()», квадратные «[]» и фигурные «{}», можно реализовать с использованием стека (stack). Вот общий алгоритм проверки:
- Создайте пустой стек, который будет служить для отслеживания открывающих скобок.
- Перебирайте каждый символ в последовательности слева направо.
- Если текущий символ — открывающая скобка («(«, «[«, или «{«), поместите его в стек.
- Если текущий символ — закрывающая скобка («)«, «]«, или «}«), выполните следующие действия:
- Проверьте, если стек пуст. Если стек пуст, это означает, что нет соответствующей открывающей скобки, и последовательность недействительна. Верните False.
- Иначе, извлеките верхний элемент из стека и проверьте, соответствует ли он текущей закрывающей скобке. Если нет, верните False.
- После перебора всего выражения, проверьте, пуст ли стек. Если стек пуст, то последовательность правильна, иначе она недействительна.
- Верните True, если стек пуст, и False, если в стеке остались непарные открывающие скобки.
C++
Для определения, является ли данная последовательность правильной, содержащей только круглые, квадратные и фигурные скобки, вы можете использовать стек (stack) в C++. Стек поможет вам проверить правильность пар скобок и их вложенность. Пример программы:
#include <iostream> #include <stack> #include <string> bool isBalanced(const std::string& expression) { std::stack<char> stack; for (char bracket : expression) { if (bracket == '(' || bracket == '[' || bracket == '{') { // Если это открывающая скобка, помещаем ее в стек stack.push(bracket); } else if (bracket == ')' || bracket == ']' || bracket == '}') { // Если это закрывающая скобка, проверяем соответствие if (stack.empty()) { return false; // Нет соответствующей открывающей скобки } char top = stack.top(); stack.pop(); if ((bracket == ')' && top != '(') || (bracket == ']' && top != '[') || (bracket == '}' && top != '{')) { return false; // Скобки не соответствуют друг другу } } } return stack.empty(); // Если стек пуст в конце, скобки сбалансированы } int main() { std::string expression; std::cout << "Введите последовательность скобок: "; std::cin >> expression; if (isBalanced(expression)) { std::cout << "Правильная последовательность скобок" << std::endl; } else { std::cout << "Неправильная последовательность скобок" << std::endl; } return 0; }
Программа использует стек для отслеживания открывающих скобок и проверки их соответствия закрывающим скобкам. Если стек пуст в конце анализа, то последовательность скобок считается правильной.
C#
using System; using System.Collections.Generic; class BracketChecker { public static bool IsBalanced(string expression) { Stack<char> stack = new Stack<char>(); foreach (char bracket in expression) { if (IsOpenBracket(bracket)) { stack.Push(bracket); } else { if (stack.Count == 0) return false; // Нет соответствующей открывающей скобки char top = stack.Pop(); if (!AreMatchingBrackets(top, bracket)) return false; // Скобки не соответствуют друг другу } } return stack.Count == 0; // Если стек пуст в конце, скобки сбалансированы } public static bool IsOpenBracket(char bracket) { return bracket == '(' || bracket == '[' || bracket == '{'; } public static bool AreMatchingBrackets(char open, char close) { return (open == '(' && close == ')') || (open == '[' && close == ']') || (open == '{' && close == '}'); } static void Main(string[] args) { Console.Write("Введите последовательность скобок: "); string expression = Console.ReadLine(); if (IsBalanced(expression)) { Console.WriteLine("Правильная последовательность скобок"); } else { Console.WriteLine("Неправильная последовательность скобок"); } } }
Python
using System; using System.Collections.Generic; class BracketChecker { public static bool IsBalanced(string expression) { Stack<char> stack = new Stack<char>(); foreach (char bracket in expression) { if (IsOpenBracket(bracket)) { stack.Push(bracket); } else { if (stack.Count == 0) return false; // Нет соответствующей открывающей скобки char top = stack.Pop(); if (!AreMatchingBrackets(top, bracket)) return false; // Скобки не соответствуют друг другу } } return stack.Count == 0; // Если стек пуст в конце, скобки сбалансированы } public static bool IsOpenBracket(char bracket) { return bracket == '(' || bracket == '[' || bracket == '{'; } public static bool AreMatchingBrackets(char open, char close) { return (open == '(' && close == ')') || (open == '[' && close == ']') || (open == '{' && close == '}'); } static void Main(string[] args) { Console.Write("Введите последовательность скобок: "); string expression = Console.ReadLine(); if (IsBalanced(expression)) { Console.WriteLine("Правильная последовательность скобок"); } else { Console.WriteLine("Неправильная последовательность скобок"); } } }
Java
import java.util.Stack; public class BracketChecker { public static boolean isBalanced(String expression) { Stack<Character> stack = new Stack<>(); String openingBrackets = "([{"; String closingBrackets = ")]}"; for (char bracket : expression.toCharArray()) { if (openingBrackets.contains(String.valueOf(bracket))) { stack.push(bracket); } else if (closingBrackets.contains(String.valueOf(bracket))) { if (stack.isEmpty()) { return false; // Нет соответствующей открывающей скобки } char top = stack.pop(); if (!areMatchingBrackets(top, bracket)) { return false; // Скобки не соответствуют друг другу } } } return stack.isEmpty(); // Если стек пуст в конце, скобки сбалансированы } public static boolean areMatchingBrackets(char open, char close) { return (open == '(' && close == ')') || (open == '[' && close == ']') || (open == '{' && close == '}'); } public static void main(String[] args) { System.out.print("Введите последовательность скобок: "); String expression = System.console().readLine(); if (isBalanced(expression)) { System.out.println("Правильная последовательность скобок"); } else { System.out.println("Неправильная последовательность скобок"); } } }
Pascal
program BracketChecker; uses SysUtils; function IsBalanced(expression: string): Boolean; var stack: string; i: Integer; begin stack := ''; for i := 1 to Length(expression) do begin if (expression[i] = '(') or (expression[i] = '[') or (expression[i] = '{') then stack := stack + expression[i] else if (expression[i] = ')') or (expression[i] = ']') or (expression[i] = '}') then begin if Length(stack) = 0 then begin Result := False; // Нет соответствующей открывающей скобки Exit; end; if (expression[i] = ')') and (stack[Length(stack)] = '(') then Delete(stack, Length(stack), 1) else if (expression[i] = ']') and (stack[Length(stack)] = '[') then Delete(stack, Length(stack), 1) else if (expression[i] = '}') and (stack[Length(stack)] = '{') then Delete(stack, Length(stack), 1) else begin Result := False; // Скобки не соответствуют друг другу Exit; end; end; end; Result := Length(stack) = 0; // Если стек пуст в конце, скобки сбалансированы end; var expression: string; begin Write('Введите последовательность скобок: '); ReadLn(expression); if IsBalanced(expression) then WriteLn('Правильная последовательность скобок') else WriteLn('Неправильная последовательность скобок'); end.
JavaScript
function isBalanced(expression) { const stack = []; const brackets = { ')': '(', ']': '[', '}': '{' }; for (let i = 0; i < expression.length; i++) { if ('([{'.includes(expression[i])) { stack.push(expression[i]); } else if (')]}'.includes(expression[i])) { if (stack.length === 0) { return false; // Нет соответствующей открывающей скобки } const top = stack.pop(); if (brackets[expression[i]] !== top) { return false; // Скобки не соответствуют друг другу } } } return stack.length === 0; // Если стек пуст в конце, скобки сбалансированы } const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question("Введите последовательность скобок: ", function (expression) { if (isBalanced(expression)) { console.log("Правильная последовательность скобок"); } else { console.log("Неправильная последовательность скобок"); } rl.close(); });
PHP
<?php function isBalanced($expression) { $stack = []; $brackets = [ ')' => '(', ']' => '[', '}' => '{' ]; for ($i = 0; $i < strlen($expression); $i++) { $char = $expression[$i]; if (in_array($char, ['(', '[', '{'])) { array_push($stack, $char); } elseif (in_array($char, [')', ']', '}'])) { if (empty($stack)) { return false; // Нет соответствующей открывающей скобки } $top = array_pop($stack); if ($brackets[$char] !== $top) { return false; // Скобки не соответствуют друг другу } } } return empty($stack); // Если стек пуст в конце, скобки сбалансированы } if (isset($_POST['expression'])) { $expression = $_POST['expression']; if (isBalanced($expression)) { echo "Правильная последовательность скобок"; } else { echo "Неправильная последовательность скобок"; } } ?> <!DOCTYPE html> <html> <head> <title>Проверка скобок</title> </head> <body> <form method="POST"> <label>Введите последовательность скобок: </label> <input type="text" name="expression"> <input type="submit" value="Проверить"> </form> </body> </html>
Эта программа проверяет последовательность скобок, введенную пользователем в веб-форме, и выводит сообщение о том, является ли последовательность правильной или нет.