Stack (Стек)
Стек — структура данных, работающая по принципу LIFO (Last In, First Out): последний добавленный элемент извлекается первым. Основные операции — push (добавить наверх), pop (снять верхний), peek (посмотреть верхний) — все за O(1).
Реализация и задача: проверка сбалансированности скобок
Напишите функцию isBalanced, которая принимает строку со скобками (), [], {} и определяет, сбалансированы ли они. Классический пример применения стека.
class Stack<T> {
private items: T[] = [];
push(item: T): void {
this.items.push(item);
}
pop(): T | undefined {
return this.items.pop();
}
peek(): T | undefined {
return this.items[this.items.length - 1];
}
isEmpty(): boolean {
return this.items.length === 0;
}
size(): number {
return this.items.length;
}
}
function isBalanced(str: string): boolean {
const stack = new Stack<string>();
const pairs: { [key: string]: string } = {
')': '(',
']': '[',
'}': '{'
};
for (const char of str) {
// Если это открывающая скобка
if (char === '(' || char === '[' || char === '{') {
stack.push(char);
}
// Если это закрывающая скобка
else if (char === ')' || char === ']' || char === '}') {
// Проверяем, есть ли соответствующая открывающая скобка
if (stack.isEmpty() || stack.pop() !== pairs[char]) {
return false;
}
}
// Игнорируем другие символы
}
// Строка сбалансирована, если стек пуст
return stack.isEmpty();
}
// Примеры использования
console.log(isBalanced("()")); // true
console.log(isBalanced("()[]{}")); // true
console.log(isBalanced("([{}])")); // true
console.log(isBalanced("([)]")); // false
console.log(isBalanced("(((")); // false
console.log(isBalanced("")); // true
console.log(isBalanced("{[()]}")); // true
console.log(isBalanced("({[}])")); // falseВременная сложность: O(n) — проходим по строке один раз. Пространственная сложность: O(n) — в худшем случае все символы открывающие.
Где применяется стек
- Проверка сбалансированности скобок, парсинг выражений
- Undo/redo, история навигации браузера
- Call stack (стек вызовов функций)
- Обход дерева/графа в глубину (DFS) без рекурсии
- Monotonic stack — «следующий больший/меньший элемент»