← Назад к вопросам
Как проверить, все ли скобки расположены правильно с точки зрения математических операций в массиве скобок?
2.0 Middle🔥 191 комментариев
#JavaScript Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Проверка корректности скобок в математических выражениях
Эта задача является классической задачей на алгоритмы и часто встречается в собеседованиях. Суть - проверить, правильно ли расположены открывающие и закрывающие скобки всех типов.
Основная идея: использование стека
Алгоритм основан на принципе стека (LIFO - Last In First Out):
function isValidBrackets(s) {
const stack = [];
const pairs = {
")": "(",
"]": "[",
"}": "{"
};
for (const char of s) {
// Если открывающая скобка - добавляем в стек
if (char === "(" || char === "[" || char === "{") {
stack.push(char);
}
// Если закрывающая скобка
else if (char === ")" || char === "]" || char === "}") {
// Если стек пуст - ошибка
if (stack.length === 0) return false;
// Проверяем, соответствует ли последняя открывающая
if (stack[stack.length - 1] !== pairs[char]) {
return false;
}
stack.pop();
}
}
// Если стек не пуст - есть лишние открывающие скобки
return stack.length === 0;
}
// Примеры использования
console.log(isValidBrackets("()")); // true
console.log(isValidBrackets("()[]{}")); // true
console.log(isValidBrackets("(]")); // false
console.log(isValidBrackets("([{}])")); // true
console.log(isValidBrackets("(")); // false
Для работы с массивом скобок
Если входные данные - это массив скобок (строк):
function checkBracketsArray(bracketsArray) {
const stack = [];
const pairs = {
")": "(",
"]": "[",
"}": "{"
};
for (const bracket of bracketsArray) {
if (["(", "[", "{"].includes(bracket)) {
stack.push(bracket);
} else if ([")", "]", "}"].includes(bracket)) {
if (stack.length === 0 || stack.pop() !== pairs[bracket]) {
return false;
}
}
}
return stack.length === 0;
}
const brackets = ["(", "[", ")", "]"];
console.log(checkBracketsArray(brackets)); // true
Сложность и производительность
- Временная сложность: O(n) - проходим по каждому символу один раз
- Пространственная сложность: O(n) в худшем случае - стек может содержать все скобки
- Оптимизация: можно проверить длину строки (если нечётная - false сразу)
Оптимизированная версия
function isValidBracketsOptimized(s) {
// Быстрая проверка
if (s.length % 2 !== 0) return false;
const stack = [];
const pairs = new Map([
[")", "("],
["]", "["],
["}", "{"]
]);
for (const char of s) {
if (pairs.has(char)) {
if (stack.pop() !== pairs.get(char)) return false;
} else {
stack.push(char);
}
}
return stack.length === 0;
}
Почему это важно в React-приложениях
Эта задача часто встречается в реальных сценариях frontend-разработки: парсинг шаблонов, проверка синтаксиса компонентов, валидация выражений JSX. Знание стека и его применения критично для продвинутого разработчика.