Apa cara terbaik untuk menerapkan Stack dan Antrian dalam JavaScript?
Saya ingin melakukan algoritma shunting-yard dan saya akan membutuhkan struktur data ini.
javascript
data-structures
stack
queue
KingNestor
sumber
sumber
Javascript memiliki metode push dan pop, yang beroperasi pada objek array Javascript biasa.
Untuk antrian, lihat di sini:
http://safalra.com/web-design/javascript/queues/
sumber
Array.
Tumpukan:
Antre:
sumber
push
danpop
metodenya, maka masalah terpecahkan. Saya benar-benar tidak mengerti maksud Anda di sini.Jika Anda ingin membuat struktur data Anda sendiri, Anda bisa membuat sendiri:
Dan untuk antrian:
sumber
Node
dihapus ketika muncul / keluar ... bukankah mereka hanya duduk-duduk memonopoli memori sampai browser mogok?delete
kata kunci, tetapi itu hanya berguna untuk menandai properti suatu objek sebagai tidak ada — yang berbeda dari hanya menetapkanundefined
ke properti . JavaScript juga memilikinew
operator, tetapi itu hanya digunakan untuk mengaturthis
ke objek kosong baru saat memanggil fungsi. Dalam C ++ Anda harus memasangkan setiapnew
dengan adelete
, tetapi tidak dalam JavaScript karena GC. Untuk berhenti menggunakan memori dalam JavaScript, cukup berhenti merujuk objek dan akhirnya akan direklamasi.Implementasi Stackdan Queuepenggunaan sayaLinked List
sumber
Pergeseran array Javascript () lambat terutama saat memegang banyak elemen. Saya tahu dua cara untuk mengimplementasikan antrian dengan kompleksitas O (1) yang diamortisasi.
Pertama adalah dengan menggunakan buffer melingkar dan penggandaan tabel. Saya sudah menerapkan ini sebelumnya. Anda dapat melihat kode sumber saya di sini https://github.com/kevyuu/rapid-queue
Cara kedua adalah dengan menggunakan dua tumpukan. Ini adalah kode untuk antrian dengan dua tumpukan
Ini adalah perbandingan kinerja menggunakan jsPerf
CircularQueue.shift () vs Array.shift ()
http://jsperf.com/rapidqueue-shift-vs-array-shift
Seperti yang Anda lihat, ini jauh lebih cepat dengan dataset besar
sumber
Ada beberapa cara di mana Anda dapat menerapkan Stacks dan Antrian dalam Javascript. Sebagian besar jawaban di atas adalah implementasi yang cukup dangkal dan saya akan mencoba untuk mengimplementasikan sesuatu yang lebih mudah dibaca (menggunakan fitur sintaks baru dari es6) dan kuat.
Inilah implementasi stack:
Dan ini adalah bagaimana Anda dapat menggunakan stack:
Jika Anda ingin melihat uraian terperinci tentang implementasi ini dan bagaimana peningkatannya, Anda dapat membaca di sini: http://jschap.com/data-structures-in-javascript-stack/
Berikut kode untuk implementasi antrian di es6:
Inilah cara Anda dapat menggunakan implementasi ini:
Untuk mempelajari tutorial lengkap tentang bagaimana struktur data ini telah diterapkan dan bagaimana ini dapat ditingkatkan lebih lanjut, Anda mungkin ingin membaca seri 'Bermain dengan struktur data dalam javascript' di jschap.com. Inilah tautan untuk antrian - http://jschap.com/playing-data-structures-javascript-queues/
sumber
Anda dapat menggunakan kelas kustom Anda sendiri berdasarkan konsep, di sini potongan kode yang dapat Anda gunakan untuk melakukan hal-hal tersebut
dan untuk memeriksa ini gunakan konsol Anda dan coba baris ini satu per satu.
sumber
sumber
Atau Anda dapat menggunakan dua array untuk menerapkan struktur data antrian.
Jika saya memunculkan elemen sekarang maka hasilnya akan menjadi 3,2,1. Tetapi kami ingin struktur FIFO sehingga Anda dapat melakukan hal berikut.
sumber
push
setelah pertama kali Andapop
Berikut ini adalah implementasi antrian yang cukup sederhana dengan dua tujuan:
Implementasi stack hanya berbagi tujuan kedua.
sumber
Implementasi stack sepele seperti yang dijelaskan dalam jawaban lain.
Namun, saya tidak menemukan jawaban yang memuaskan di utas ini untuk mengimplementasikan antrian di javascript, jadi saya membuatnya sendiri.
Ada tiga jenis solusi di utas ini:
array.shift()
array besar sangat tidak efisien.Array tunda tertunda adalah solusi paling memuaskan dalam pikiran saya, tetapi mereka masih menyimpan semuanya dalam satu array bersebelahan besar yang dapat bermasalah, dan aplikasi akan terhuyung-huyung ketika array diiris.
Saya membuat implementasi menggunakan daftar array array kecil (masing-masing 1000 elemen maks). Array berperilaku seperti array shift tertunda, kecuali mereka tidak pernah diiris: ketika setiap elemen dalam array dihapus, array hanya dibuang.
Paket ini pada npm dengan fungsionalitas FIFO dasar, saya baru saja mendorongnya baru-baru ini. Kode ini dibagi menjadi dua bagian.
Inilah bagian pertama
Dan inilah
Queue
kelas utamanya :Ketik anotasi (
: X
) dapat dengan mudah dihapus untuk mendapatkan kode javascript ES6.sumber
Jika Anda memahami tumpukan dengan fungsi push () dan pop (), maka antrian hanya untuk membuat salah satu dari operasi ini dalam arti yang berlawanan. Oposite of push () adalah unshift () dan oposite dari pop () adalah shift (). Kemudian:
sumber
.shift()
Metode ini tidak implementasi antrian yang tepat. Ini adalah O (n) dan bukan O (1), dan akan lambat untuk antrian besar.Ini adalah versi daftar tertaut dari antrian yang juga menyertakan simpul terakhir, seperti yang disarankan oleh @perkins dan seperti yang paling sesuai.
sumber
Jika Anda mencari implementasi ES6 OOP dari struktur data Stack and Queue dengan beberapa operasi dasar (berdasarkan daftar tertaut) maka mungkin terlihat seperti ini:
Queue.js
Stack.js
Dan implementasi LinkedList yang digunakan untuk Stack dan Antrian dalam contoh di atas dapat ditemukan di GitHub di sini .
sumber
Tanpa Array
sumber
Struktur Array biasa dalam Javascript adalah Stack (masuk pertama, keluar terakhir) dan juga dapat digunakan sebagai Antrian (masuk pertama, keluar pertama) tergantung pada panggilan yang Anda buat.
Periksa tautan ini untuk melihat bagaimana membuat tindakan Array seperti Antrian:
Antrian
sumber
Salam,
Dalam Javascript implementasi tumpukan dan antrian adalah sebagai berikut:
Tumpukan: Tumpukan adalah wadah benda yang dimasukkan dan dihapus menurut prinsip last-in-first-out (LIFO).
Antrian: Antrian adalah wadah benda (koleksi linier) yang dimasukkan dan dihapus sesuai dengan prinsip masuk pertama keluar pertama (FIFO).
Unshift: Metode menambahkan satu atau lebih elemen ke awal array.
Shift: Metode ini menghapus elemen pertama dari array.
sumber
sumber
Sepertinya saya bahwa built-in array baik untuk stack. Jika Anda ingin Antrian dalam TypeScript di sini adalah implementasi
Dan inilah
Jest
ujian untuk ituSemoga seseorang menemukan ini berguna,
Bersulang,
Stu
sumber
Buat sepasang kelas yang menyediakan berbagai metode yang dimiliki masing-masing struktur data ini (push, pop, mengintip, dll). Sekarang implementasikan metodenya. Jika Anda terbiasa dengan konsep di balik tumpukan / antrian, ini seharusnya cukup mudah. Anda dapat menerapkan tumpukan dengan array, dan antrian dengan daftar tertaut, meskipun pasti ada cara lain untuk melakukannya. Javascript akan memudahkan ini, karena diketik dengan lemah, jadi Anda bahkan tidak perlu khawatir tentang tipe generik, yang harus Anda lakukan jika Anda menerapkannya di Java atau C #.
sumber
Inilah Implementasi Stacks saya.
sumber
Anda dapat menggunakan WeakMaps untuk mengimplementasikan properti pribadi di kelas ES6 dan manfaat dari properti String dan metode dalam bahasa JavaScript seperti di bawah ini:
sumber
Bangun Antrian menggunakan dua tumpukan.
sumber