Структуры данных с помощью JavaScript - Глава 3 - Стеки и очереди

❗️Все фрагменты кода, которые вы увидите ниже, являются псевдокодом. Если хотите увидеть рабочий код - нажмите здесь
Предпосылки
Прежде чем продолжить, убедитесь, что вы просмотрели оба этих сообщения, потому что я использую связанные списки для реализации стека и очереди, а не массивов.
Зачем использовать связанные списки при реализации стеков и очередей?
Я нашел несколько строк по этому поводу -
… Поскольку связанные списки хранят элементы данных в линейной последовательности, их можно использовать для предоставления альтернативных реализаций стеков и очередей. Одним из преимуществ использования связанных списков является то, что нам не нужно беспокоиться о заполнении чего-то вроде массива - мы можем просто выделять ячейки столько, сколько нам нужно (если у нас не закончится память). Реализовать стек с использованием связанного списка особенно просто, потому что все обращения к стеку находятся наверху. Один конец связанного списка, начало, всегда доступен напрямую. Поэтому мы должны расположить элементы так, чтобы верхний элемент стека находился в начале связанного списка, а нижний элемент стека находился в конце связанного списка. Мы можем представить пустой стек с нулевым значением…
Другая причина заключается в том, что вы сможете практиковать связанные списки при реализации стеков и очередей, которые дадут вам понимание того, как работают стеки и очереди, и сделают вас сильными с помощью связанных списков.
полностью прочитать статью здесь ..
Давай начнем!!


Основной

⚜️ Список
- Толкать
- Поп
- Подглядывать
- Задний ход
- Длина
- Поиск
- Пустой
- Траверс
А теперь давайте напишем код…

🔅 Нажать
push( item ){
let node = new Node( item )
if( this.top ) {
node.next = this.top
this.top = node
} else {
this.top = node
}
}

🔅 Поп
pop() {
if( this.top ) {
let itemToPop = this.top
this.top = this.top.next
return itemToPop.data
} else {
log('Stack is empty!')
return false;
}
}

🔅 Подглядывать
peek() {
if( this.top ) {
return this.top.data
} else {
return null
}
}

🔅 Реверс
reverse() {
let current = this.top
let prev = null;
while( current ) {
let next = current.next
current.next = prev
prev = current
current = next
}
this.top = prev
}
⚠️ Это то же самое, что перевернуть односвязный список

🔅 Длина, поиск и пусто
length() {
let current = this.top
let counter = 0
while( current ) {
counter++
current = current.next
}
return counter
}
search( item ) {
let current = this.top
while( current ) {
if( current.data === item ) return true
current = current.next
}
return false
}
isEmpty() {
return this.length > 1
}

🔅 Траверс
traverse( fn ) {
let current = this.top
while( current ) {
fn( current )
current = current.next
}
}



Основной

⚜️ Список
- Поставить в очередь
- Dequeue
- Длина
- Подглядывать
- Пустой
- Траверс

🔅 Поставить в очередь
enqueue( item ) {
let node = new Node( item )
if( !this.head ) {
this.head = node
this.tail = node
} else {
this.tail.next = node
this.tail = node
}
}

🔅 Dequeue
dequeue() {
if( !this.head ) {
return 'No item'
} else {
let itemToPop = this.head
this.head = this.head.next
return itemToPop
}
}

🔅 Длина, вид и пусто
length() {
let current, counter
[ current, counter ] = [ this.head, 0 ]
while( current ) {
counter++
current = current.next
}
return counter
}
peek() {
if( this.head ) {
return this.head.data
} else {
return 'Empty'
}
}
isEmpty() {
return this.length() < 1
}

🔅 Траверс
traverse( fn ) {
let current = this.head
while( current ) {
fn( current )
current = current.next
}
}

Вы можете реализовать любую операцию над этими стеками и очередями, которые вы можете реализовать с помощью связанных списков.
Упражняться
- Hackerrank - Структуры данных
Последнее важное…

Об этом посте
Этот пост является третьим выпуском из серии «DS с JS». В этой серии будет больше. Следующее будет в следующий понедельник утром. Следите за обновлениями!
Это оно
Удачного кодирования !!
🎧 Прослушивание Touch - Matia Cupelli. Печаль, разбитое сердце, фортепиано и мечты ... не хватает только этой музыки ...

Если вам понравилась эта статья, пожалуйста, похлопайте по ней 👏 и поделитесь ею! Если вам не нравится этот пост или у вас есть какие-либо вопросы относительно всего, что я упомянул в этом посте. Не стесняйтесь спрашивать меня. Просто опубликуйте вопрос в моем разделе Спроси меня о чем угодно, нажав здесь.
Если это так, подписывайтесь на меня на Medium или Twitter. Чтобы задать вопрос, перейдите по этой ссылке. Подробнее обо мне на моем сайте.