Каков наилучший способ реализации стека и очереди в JavaScript?
Я ищу алгоритм шунтирования и мне понадобятся эти структуры данных.
javascript
data-structures
stack
queue
KingNestor
источник
источник
В Javascript есть методы push и pop, которые работают с обычными объектами массива Javascript.
Для очередей смотрите здесь:
http://safalra.com/web-design/javascript/queues/
источник
Массивы.
стек:
Очередь:
источник
push
иpop
методами, то проблема решена. Я действительно не вижу твоей точки зрения здесь.Если вы хотите создать свои собственные структуры данных, вы можете создать свои собственные:
И для очереди:
источник
Node
s удалялись при выталкивании / снятии очереди ... разве они не будут сидеть сложа руки, пока браузер не рухнет?delete
ключевое слово, но это полезно только для того, чтобы пометить свойство объекта как отсутствующее, что отличается от простого присвоенияundefined
свойству . В JavaScript также естьnew
оператор, но он просто используется для установкиthis
нового пустого объекта при вызове функции. В C ++ вам нужно соединить каждыйnew
сdelete
, но не в JavaScript, потому что GC. Чтобы прекратить использование памяти в JavaScript, просто прекратите ссылаться на объект, и он в конечном итоге будет восстановлен.Моя реализация Stackи QueueиспользованиеLinked List
источник
Javascript array shift () работает медленно, особенно когда содержит много элементов. Я знаю два способа реализации очереди с амортизированной сложностью O (1).
Во-первых, используя круговой буфер и удвоение таблицы. Я реализовал это раньше. Вы можете увидеть мой исходный код здесь https://github.com/kevyuu/rapid-queue
Второй способ - использование двух стеков. Это код для очереди с двумя стеками
Это сравнение производительности с использованием jsPerf
CircularQueue.shift () против Array.shift ()
http://jsperf.com/rapidqueue-shift-vs-array-shift
Как вы можете видеть, это значительно быстрее с большим набором данных
источник
Есть немало способов, которыми вы можете реализовать стеки и очереди в Javascript. Большинство ответов, приведенных выше, являются довольно поверхностными реализациями, и я постараюсь реализовать что-то более читабельное (с использованием новых синтаксических функций es6) и надежное.
Вот реализация стека:
И вот как вы можете использовать стек:
Если вы хотите ознакомиться с подробным описанием этой реализации и способов ее дальнейшего улучшения, вы можете прочитать здесь: http://jschap.com/data-structures-in-javascript-stack/
Вот код для реализации очереди в es6:
Вот как вы можете использовать эту реализацию:
Чтобы пройти полное руководство о том, как эти структуры данных были реализованы и как их можно улучшить, вы можете просмотреть серию «Игра со структурами данных в javascript» на jschap.com. Вот ссылки для очередей - http://jschap.com/playing-data-structures-javascript-queues/
источник
Вы можете использовать свой собственный класс настройки, основанный на концепции, здесь фрагмент кода, который вы можете использовать, чтобы делать вещи
и чтобы проверить это, используйте консоль и попробуйте эти строки одну за другой.
источник
источник
Или же вы можете использовать два массива для реализации структуры данных очереди.
Если я сейчас вытолкну элементы, то результат будет 3,2,1. Но нам нужна структура FIFO, чтобы вы могли сделать следующее.
источник
push
после первого разаpop
Вот довольно простая реализация очереди с двумя целями:
Реализация стека разделяет только вторую цель.
источник
Реализация стека является тривиальной, как объяснено в других ответах.
Тем не менее, я не нашел удовлетворительных ответов в этой ветке для реализации очереди в javascript, поэтому я сделал свой собственный.
В этой теме есть три типа решений:
array.shift()
большого массива очень неэффективно.Я считаю, что массивы с отложенным сдвигом - самое удовлетворительное решение, но они все еще хранят все в одном большом непрерывном массиве, что может быть проблематично, и приложение будет колебаться, когда массив будет разрезан.
Я сделал реализацию, используя связанные списки небольших массивов (максимум 1000 элементов каждый). Массивы ведут себя как массивы с отложенным сдвигом, за исключением того, что они никогда не разделяются: когда каждый элемент в массиве удаляется, массив просто отбрасывается.
Пакет находится на npm с базовой функциональностью FIFO, я только недавно его отправил. Код разбит на две части.
Вот первая часть
А вот и основной
Queue
класс:Тип аннотации (
: X
) могут быть легко удалены для получения кода ES6 JavaScript.источник
Если вы понимаете стеки с помощью функций push () и pop (), то очередь - это просто выполнение одной из этих операций в противоположном смысле. Противоположностью push () является unshift () и противоположность pop () es shift (). Затем:
источник
.shift()
Метод не является правильной реализации очереди. Это O (n), а не O (1), и будет медленным для больших очередей.Вот версия связанного списка очереди, которая также включает в себя последний узел, предложенный @perkins и наиболее подходящий.
источник
Если вы ищете реализацию структуры данных стека и очереди ES6 OOP с некоторыми базовыми операциями (на основе связанных списков), то это может выглядеть так:
Queue.js
Stack.js
А реализацию LinkedList, которая используется для стека и очереди в приведенных выше примерах, можно найти на GitHub здесь .
источник
Нет массива (ов)
источник
Обычная структура массива в Javascript - это стек (первым пришел, последним вышел), который также может быть использован в качестве очереди (первым вошел, первым вышел) в зависимости от того, какие звонки вы делаете.
Проверьте эту ссылку, чтобы увидеть, как заставить массив работать как очередь:
Очереди
источник
С Уважением,
В Javascript реализация стеков и очередей выглядит следующим образом:
Стек: стек - это контейнер объектов, которые вставляются и удаляются в соответствии с принципом «последний пришел первым - вышел» (LIFO).
Очередь: Очередь - это контейнер объектов (линейная коллекция), которые вставляются и удаляются в соответствии с принципом «первым пришел-первым вышел» (FIFO).
Unshift: метод добавляет один или несколько элементов в начало массива.
Shift: метод удаляет первый элемент из массива.
источник
источник
Мне кажется, что встроенный массив подходит для стека. Если вы хотите Очередь в TypeScript, вот реализация
И вот
Jest
тест для негоНадеюсь, кто-то найдет это полезным,
Ура,
Stu
источник
Создайте пару классов, которые предоставляют различные методы, которые есть в каждой из этих структур данных (push, pop, peek и т. Д.). Теперь реализуем методы. Если вы знакомы с концепциями стека / очереди, это должно быть довольно просто. Вы можете реализовать стек с массивом и очередь со связанным списком, хотя, безусловно, есть и другие способы сделать это. Javascript сделает это легко, потому что он слабо типизирован, так что вам даже не нужно беспокоиться о универсальных типах, что вам придется делать, если вы реализуете его в Java или C #.
источник
Вот моя реализация стеков.
источник
вы можете использовать WeakMaps для реализации частной собственности в классе ES6 и преимуществ свойств String и методов на языке JavaScript, как показано ниже:
источник
Построить очередь, используя два стека.
источник