Jaki jest najlepszy sposób na implementację stosu i kolejki w JavaScript?
Szukam algorytmu manewrowego i będę potrzebować tych struktur danych.
javascript
data-structures
stack
queue
KingNestor
źródło
źródło
JavaScript ma metody push i pop, które działają na zwykłych obiektach tablicy JavaScript.
Aby zobaczyć kolejki, spójrz tutaj:
http://safalra.com/web-design/javascript/queues/
źródło
Tablice
Stos:
Kolejka:
źródło
push
ipop
, wtedy problem zostanie rozwiązany. Naprawdę nie widzę tutaj twojej racji.Jeśli chcesz tworzyć własne struktury danych, możesz zbudować własne:
A w kolejce:
źródło
Node
pliki były usuwane podczas popping / dequeuing ... czy nie będą po prostu siedzieć w pobliżu pamięci, dopóki przeglądarka się nie zawiesi?delete
słowo kluczowe, ale jest to przydatne tylko do oznaczenia właściwości obiektu jako nieobecnej - co różni się od przypisaniaundefined
do właściwości . JavaScript ma równieżnew
operator, ale służy on tylko do ustawieniathis
nowego pustego obiektu podczas wywoływania funkcji. W C ++ musisz sparować każdynew
zdelete
, ale nie w JavaScript, ponieważ GC. Aby przestać używać pamięci w JavaScript, po prostu przestań odwoływać się do obiektu, który ostatecznie zostanie odzyskany.Moja implementacja Stacki QueueużywanieLinked List
źródło
Przesunięcie tablicy JavaScript () jest wolne, szczególnie przy przechowywaniu wielu elementów. Znam dwa sposoby implementacji kolejki o zamortyzowanej złożoności O (1).
Pierwszym z nich jest użycie okrągłego bufora i podwojenie tabeli. Wcześniej to zaimplementowałem. Możesz zobaczyć mój kod źródłowy tutaj https://github.com/kevyuu/rapid-queue
Drugi sposób polega na użyciu dwóch stosów. To jest kod kolejki z dwoma stosami
Jest to porównanie wydajności przy użyciu jsPerf
CircularQueue.shift () vs Array.shift ()
http://jsperf.com/rapidqueue-shift-vs-array-shift
Jak widać, przy dużym zestawie danych jest to znacznie szybsze
źródło
Istnieje wiele sposobów implementacji stosów i kolejek w JavaScript. Większość powyższych odpowiedzi to dość płytkie implementacje i starałbym się zaimplementować coś bardziej czytelnego (przy użyciu nowych funkcji składni es6) i solidnego.
Oto implementacja stosu:
I w ten sposób możesz użyć stosu:
Jeśli chcesz zobaczyć szczegółowy opis tej implementacji i sposobów jej dalszej poprawy, możesz przeczytać tutaj: http://jschap.com/data-structures-in-javascript-stack/
Oto kod do implementacji kolejki w es6:
Oto jak możesz użyć tej implementacji:
Aby zapoznać się z pełnym samouczkiem, w jaki sposób zaimplementowano te struktury danych i jak można je dalej ulepszyć, możesz przejrzeć serię „Zabawa ze strukturami danych w javascript” na stronie jschap.com. Oto linki do kolejek - http://jschap.com/playing-data-structures-javascript-queues/
źródło
Możesz użyć własnej klasy dostosowywania opartej na koncepcji, tutaj fragment kodu, którego możesz użyć do zrobienia tego
i aby to sprawdzić, użyj konsoli i wypróbuj kolejno te linie.
źródło
źródło
Albo możesz użyć dwóch tablic do implementacji struktury danych kolejki.
Jeśli wstawię teraz elementy, wynik wyniesie 3,2,1. Ale chcemy struktury FIFO, abyś mógł wykonać następujące czynności.
źródło
push
po raz pierwszypop
Oto dość prosta implementacja kolejki z dwoma celami:
Implementacja stosu ma tylko drugi cel.
źródło
Implementacja stosu jest banalna, jak wyjaśniono w innych odpowiedziach.
Jednak w tym wątku nie znalazłem zadowalających odpowiedzi na implementację kolejki w javascript, więc zrobiłem własną.
Istnieją trzy rodzaje rozwiązań w tym wątku:
array.shift()
dużej tablicy jest bardzo nieefektywne.Opóźnione tablice zmiany są moim zdaniem najbardziej zadowalającym rozwiązaniem, ale wciąż przechowują wszystko w jednej dużej ciągłej tablicy, co może być problematyczne, a aplikacja będzie się wahać, gdy tablica zostanie podzielona na plasterki.
Wykonałem implementację, używając połączonych list małych tablic (maks. 1000 elementów każda). Tablice zachowują się jak tablice z opóźnionym przesunięciem, z tym wyjątkiem, że nigdy nie są dzielone na plasterki: gdy każdy element w tablicy jest usuwany, tablica jest po prostu odrzucana.
Pakiet jest na npm z podstawową funkcjonalnością FIFO, niedawno go wypchnąłem. Kod jest podzielony na dwie części.
Oto pierwsza część
A oto główna
Queue
klasa:Wpisz adnotacje (
: X
) można łatwo usunąć, aby uzyskać kod javascript ES6.źródło
Jeśli rozumiesz stosy za pomocą funkcji push () i pop (), to kolejka polega na wykonaniu jednej z tych operacji w odwrotnym sensie. Przeciwieństwem push () jest unshift () i przeciwieństwo pop () es shift (). Następnie:
źródło
.shift()
metoda nie jest poprawną implementacją kolejki. Jest to O (n) zamiast O (1) i będzie powolny w przypadku dużych kolejek.Oto wersja kolejki z połączoną listą, która zawiera również ostatni węzeł, zgodnie z sugestią @perkins i najbardziej odpowiednią.
źródło
Jeśli szukasz implementacji ESOP OOP struktury danych stosu i kolejki z kilkoma podstawowymi operacjami (opartymi na listach połączonych), może to wyglądać następująco:
Queue.js
Stack.js
I implementacja LinkedList, która jest używana dla stosu i kolejki w powyższych przykładach, można znaleźć na GitHub tutaj .
źródło
Brak tablic
źródło
Zwykła struktura tablic w Javascripcie to stos (pierwsze wejście, ostatnie wyjście) i może być również używane jako kolejka (pierwsze wejście, pierwsze wyjście) w zależności od wykonywanych połączeń.
Sprawdź ten link, aby zobaczyć, jak sprawić, by tablica działała jak kolejka:
Kolejki
źródło
Pozdrowienia,
W języku JavaScript implementacja stosów i kolejek wygląda następująco:
Stos: Stos to pojemnik z obiektami, które są wstawiane i usuwane zgodnie z zasadą „ostatnie weszło-pierwsze wyszło” (LIFO).
Kolejka: Kolejka to kontener obiektów (kolekcja liniowa), które są wstawiane i usuwane zgodnie z zasadą „pierwsze weszło pierwsze wyszło” (FIFO).
Unshift: Metoda dodaje jeden lub więcej elementów na początku tablicy.
Shift: metoda usuwa pierwszy element z tablicy.
źródło
źródło
Wydaje mi się, że wbudowana tablica jest odpowiednia dla stosu. Jeśli chcesz mieć kolejkę w TypeScript, tutaj jest implementacja
A oto
Jest
test na toMam nadzieję, że ktoś uzna to za przydatne,
Twoje zdrowie,
Stu
źródło
Utwórz parę klas, które zapewniają różne metody, które ma każda z tych struktur danych (push, pop, peek itp.). Teraz zaimplementuj metody. Jeśli znasz pojęcia związane ze stosem / kolejką, powinno to być całkiem proste. Możesz zaimplementować stos za pomocą tablicy i kolejki z połączoną listą, chociaż na pewno istnieją inne sposoby na obejście tego. JavaScript ułatwi to, ponieważ jest słabo wpisany, więc nie musisz się nawet martwić o ogólne typy, które musisz zrobić, jeśli implementujesz go w Javie lub C #.
źródło
Oto moja implementacja stosów.
źródło
możesz użyć WeakMaps do implementacji własności prywatnej w klasie ES6 oraz korzyści z właściwości i metod String w języku JavaScript, takich jak poniżej:
źródło
Zbuduj kolejkę, używając dwóch stosów.
źródło