Автор оригинала: FreeCodeCamp Community Member.
Кевин Тюреей
Стек является наиболее элементарным из структур данных в информатике.
Структуры данных – это способ организовать нашу информацию. Они предоставляют средства для хранения различных типов данных уникальных способов и методов для доступа к всей или отличительной части.
Начиная с стека
Вы когда-нибудь использовали стек? Конечно! Ваша электронная почта – это форма стека, новая почта поставляется и находится сверху. Когда вы закончите читать новейшее электронное письмо, вы удалите его сверху. В разработке, всякий раз, когда вы вызываете функцию, которая находится на стеке в двигателе, который обрабатывает код.
Как мы используем стеки – это Последнее в первую очередь система обработки.
Аналогия будет рецептом. Предположим, мы хотим сделать миску спагетти. Какие шаги?
- Получить горшок
- Добавьте воды
- Принести воду до кипения
- Добавить соль в воду
- Добавить спагетти
- Повар спагетти до тендера
Теперь, когда спагетти сделано, мы должны вернуться туда, где мы начали, чистая кухня. Нам нужен метод для организации нашей списка задач и поможет нам вернуться туда, где мы остановились.
JavaScript – это отдельный резьбовый язык. В простейших условиях это означает, что он может сделать только одну вещь за раз, как мы. Итак, как наш язык выбора обрабатывает это организованным способом, стеками?
Как видите, стек является чистым способом обработки задач, удаляя их и в конечном итоге возвращаясь к началу.
Стеки поставляются со стоимостью: память. Для каждого элемента мы размещаемся в стеке, мы распределите кадру стека к нему. Подумайте о индексе массива. Каждый индекс выделяется пространство для чего-либо. Если мы продолжим добавлением и добавлением в стек, мы удерживаем возможность выхода из места, как парковка, которая заполнена. Когда это произойдет, у нас есть переполнение, следовательно, термин «переполнение стека». Это может привести к сбоям и застрявшим процессам.
Как мы воспитываем память? Когда элемент удаляется из стека, JavaScript использует «сборку мусора», чтобы освободить ресурсы и восстановить ранее использованное место для хранения.
Выполнение
Во-первых, как мы храним данные? Что мы можем использовать в JavaScript для хранения данных? Мы можем использовать собственные объекты, такие как массивы, которые мы знакомы и используем встроенные методы, толчок и поп. Хорошо, я думаю, мы закончили, увидимся позже …
Нах, чтобы понять, как работает стек под капотом, мы используем форму базовой объекты.
Нам нужен конструктор для установления механизма хранения и свойства при вызове.
const Stack = function(capacity) { this.storage = {}; this.capacity = capacity || Infinity; this._count = 0;}
Это представляет собой механизм хранения стека. Как мы можем протолкнуть данные в стек в манере? Добавить толчок к прототипу стека.
Stack.prototype.push = function(value) { if (this._count < this._capacity){ this.storage[this._count++] = value; return this._count; } return "Max capacity reached, please remove a value before inserting a new value";}
Метод push проверяет нашу емкость. Если true, мы добавляем значение для хранения и возврата, сколько элементов в стеке.
[this._count ++] сначала оценивается как 0, и мы используем оператор PostFix ++ для увеличения количества. Наш стек имеет значение в этом .Storage [‘0’], и мы возвращаем 1, потому что у нас есть один элемент в нашем стеке.
Давайте удалим элементы или «поп» их от стека.
Stack.prototype.pop = function() { let value = this.storage[--this._count]; delete this.storage[this._count]; if (this._count < 0) { this._count = 0; } return value;}
С POP, мы храним последнее значение на стеке. Если мы сначала удалим его, у нас не будет его в качестве возвращаемого значения. Из-за префиксного оператора, – мы находим значение this.count и уменьшайте его первым, прежде чем оценивать его. Если у нас есть this.count, this.Storage [- this.count] оценивается как это .Storage [‘0’].
Как насчет увидеть, что на верхней части стека? Интерфейс для этого – «PEEK».
Stack.prototype.peek = function() { return this.storage[this._count -1]}
Наконец, считать …
Stack.prototype.count = function(){ return this._count;}
Полная реализация стиль ES6 с классом стека:
class Stack { constructor(capacity) { this.storage = {}; this._count = 0; this.capacity = capacity || Infinity; }
push(value) { if (this._count < this.capacity){ this.storage[this._count++] = value; return this._count; } return "Max capacity reached, please remove a value before inserting a new value"; }
pop() { let value = this.storage[--this._count]; delete this.storage[this._count]; if (this._count < 0) { this._count = 0; } return value; } peek() { return this.storage[this._count - 1]; } count() { return this._count; }};let stack = new Stack();stack; // Stack { storage: {}, _count: 0, capacity: Infinity }stack.push('yea')stack.push('oh yea');
stack; // Stack {storage: { 0: 'yea', 1: 'oh yea' }, _count: 2, capacity: Infinity }
stack.pop(); // 'oh yea'stack; // Stack { storage: { 0: 'yea' }, _count: 1, capacity: Infinity }
stack.push('nope');stack.push('yup');stack; // Stack {storage: { 0: 'yea', 1: 'nope', 2: 'yup' }, _count: 3, capacity: Infinity }
stack.count(); // 3stack.peek(); // 'yup'stack; // Stack {storage: { 0: 'yea', 1: 'nope', 2: 'yup' }, _count: 3, capacity: Infinity }
Спасибо за прочтение этой статьи. Моя цель состояла в том, чтобы дать четкое ненужное объяснение стеков, их использования, и почему мы им нужны. Далее: очереди Отказ