#
Stack
Stack (стек) — это структура данных, работающая по принципу LIFO (Last In, First Out), что означает: последний добавленный элемент извлекается первым.
#
Создание Stack
#
Реализация стека на массиве
В JavaScript массив
Array
можно использовать для создания стека, так как у него есть встроенные методы .push() и .pop()
class Stack {
constructor() {
this.items = [];
}
push(value) {
this.items.push(value);
}
pop() {
if (this.isEmpty()) {
return "Стек пуст";
}
return this.items.pop();
}
peek() {
return this.isEmpty() ? "Стек пуст" : this.items[this.items.length - 1];
}
isEmpty() {
return this.items.length === 0;
}
size() {
return this.items.length;
}
}
#
Реализация стека на объекте
Массивы в JavaScript могут быть менее эффективными для стека, так как .pop() может потребовать переиндексации элементов. Альтернативный вариант — использовать объект
Object
.
class Stack {
constructor() {
this.items = {};
this.count = 0;
}
push(value) {
this.items[this.count] = value;
this.count++;
}
pop() {
if (this.isEmpty()) {
return "Стек пуст";
}
this.count--;
const value = this.items[this.count];
delete this.items[this.count];
return value;
}
peek() {
return this.isEmpty() ? "Стек пуст" : this.items[this.count - 1];
}
isEmpty() {
return this.count === 0;
}
size() {
return this.count;
}
}
#
Основные методы Stack
push(value)— добавляет элемент в вершину стека.pop()— удаляет и возвращает последний добавленный элемент.peek()— возвращает верхний элемент без удаления.isEmpty()— проверяет, пуст ли стек.size()— возвращает количество элементов.
#
Примеры работы с методами Stack
const stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
console.log(stack.pop()); // 3
console.log(stack.peek()); // 2
console.log(stack.size()); // 2
console.log(stack.isEmpty()); // false
#
Применение Stack
1. Обратный порядок (реверс) данных
function reverseString(str) {
const stack = new Stack();
for (const char of str) {
stack.push(char);
}
let reversed = "";
while (!stack.isEmpty()) {
reversed += stack.pop();
}
return reversed;
}
console.log(reverseString("hello")); // "olleh"
2. Проверка сбалансированности скобок
function isBalanced(expression) {
const stack = new Stack();
const pairs = { ")": "(", "}": "{", "]": "[" };
for (const char of expression) {
if (Object.values(pairs).includes(char)) {
stack.push(char);
} else if (Object.keys(pairs).includes(char)) {
if (stack.isEmpty() || stack.pop() !== pairs[char]) {
return false;
}
}
}
return stack.isEmpty();
}
console.log(isBalanced("{[()]}")); // true
console.log(isBalanced("{[(])}")); // false
#
Заключение
Stack — это удобная структура данных, которая позволяет управлять элементами по принципу LIFO (последний вошел – первый вышел). Она широко применяется в различных алгоритмах, таких как обратный порядок строк, проверка выражений, рекурсия и обработка вызовов функций.