Indonesian (Bahasa Indonesia) translation by Fajar Bahri (you can also view the original English article) Dua dari struktur data yang paling umum digunakan dalam pengembangan web adalah stack
dan queue. Banyak pengguna internet, termasuk web developer, tidak menyadari fakta menakjubkan ini. Jika Anda adalah salah satu pengembang ini, kemudian mempersiapkan diri untuk mencerahkan dua contoh: operasi 'undo' editor teks menggunakan setumpuk untuk mengatur data; event-loop dari browser web, yang menangani event (klik, hoovers, dll), menggunakan antrian untuk mengolah data. Sekarang berhenti sejenak dan bayangkan berapa kali kami, pengguna dan pengembang, mengunakan stack dan queue. Itu menakjubkan, kan? Karena mereka ubiquity dan kesamaan dalam desain, saya telah memutuskan untuk menggunakan mereka untuk memperkenalkan Anda struktur data. StackDalam ilmu komputer, stack adalah struktur data linier. Jika pernyataan ini memegang nilai marjinal untuk Anda, seperti aslinya dengan saya, pertimbangkan ini alternatif: stack mengatur data ke berurutan. Berurutan ini sering digambarkan sebagai tumpukan hidangan di kafetaria. Ketika piring ditambahkan ke tumpukan piring, piring mempertahankan urutan ketika ditambahkan; Selain itu, ketika piring ditambahkan, itu mendorong menuju bagian bawah tumpukan. Setiap kali kita menambahkan piring baru, piring mendorong menuju bagian bawah tumpukan, tapi ini juga merupakan bagian atas tumpukan piring. Proses ini menambahkan piring akan mempertahankan urutan ketika setiap piring ditambahkan ke dalam tumpukan. Mengurangi piring dari tumpukan juga akan mempertahankan urutan semua piring. Jika piring dihapus dari atas tumpukan, setiap piring lain di tumpukan akan tetap mempertahankan urutan yang benar dalam tumpukan. Apa yang saya jelaskan, mungkin terlalu banyak kata, adalah bagaimana piring ditambahkan dan dikurangi dibanyak kafetaria! Untuk memberikan contoh yang lebih teknis dari tumpukan, mari kita ingat 'undo' pengoperasian sebuah editor teks. Setiap kali teks ditambahkan ke editor teks, teks ini didorong ke dalam tumpukan. tambahan pertama untuk editor teks yang mewakili bagian bawah tumpukan; perubahan terbaru mewakili bagian atas tumpukan. Jika pengguna ingin membatalkan perubahan, bagian atas tumpukan akan dihapus. Proses ini dapat diulang sampai ada penambahan tumpukan, yang merupakan sebuah file kosong tidak lebih! Operasi StackKarena kita sekarang memiliki model konseptual dari tumpukan, mari kita menetapkan dua operasi tumpukan:
Implementasi StackSekarang mari kita menulis kode untuk tumpukan! Properti dari StackUntuk implementasi kita, kami akan membuat constructor yang bernama function Stack() { this._size = 0; this._storage = {}; }
Metode stackKita perlu menentukan metode yang dapat menambah (push) dan menghapus (pop) data dari tumpukan. Mari kita mulai dengan mendorong data. Metode 1 dari
2: (Metode ini dapat dibagi di antara semua contoh dari Kami memiliki dua persyaratan untuk metode ini:
Stack.prototype.push = function(data) { // increases the size of our storage var size = this._size++; // assigns size as a key of storage // assigns data as the value of this key this._storage[size] = data; }; Implementasi Jika stack kami memanggil Metode
2 2: Kita sekarang bisa mendorong data ke tumpukan; langkah logis berikutnya adalah popping (menghapus) data dari tumpukan. Popping data dari tumpukan tidak hanya menghapus data; itu adalah menghapus hanya data yang paling baru dari tumpukan. Berikut adalah tujuan kami untuk metode ini:
Stack.prototype.pop = function() { var size = this._size, deletedData; deletedData = this._storage[size]; delete this._storage[size]; this.size--; return deletedData; };
Jika kita menguji implementasi Masalah muncul, namun, ketika kita membalik urutan pemanggilan. Pertimbangkan skenario berikut: kita memanggil Menangani
kasus penggunaan ini, kita akan menambahkan jika Stack.prototype.pop = function() { var size = this._size, deletedData; if (size) { deletedData = this._storage[size]; delete this._storage[size]; this._size--; return deletedData; } }; Dengan penambahan Implementasi lengkap Stack Implementasi lengkap function Stack() { this._size = 0; this._storage = {}; } Stack.prototype.push = function(data) { var size = ++this._size; this._storage[size] = data; }; Stack.prototype.pop = function() { var size = this._size, deletedData; if (size) { deletedData = this._storage[size]; delete this._storage[size]; this._size--; return deletedData; } }; Dari tumpukan untuk antrianTumpukan berguna ketika kami ingin menambahkan
data secara berurutan dan menghapus data. Berdasarkan definisi, tumpukan hanya menghapus data yang paling baru ditambahkan. Apa yang terjadi jika kita ingin menghapus data paling lama? Kami ingin menggunakan struktur data yang bernama antrian. AntrianMirip dengan tumpukan, antrian adalah struktur data linier. Tidak seperti tumpukan, antrian menghapus hanya data paling dulu dimasukan. Untuk membantu Anda konsep bagaimana ini bekerja, mari kita luangkan waktu untuk menggunakan analogi. Bayangkan antrian yang sangat mirip dengan sistem tiket Deli. Setiap pelanggan mengambil tiket dan dilayani ketika nomor mereka disebut. Pelanggan yang membutuhkan tiket pertama harus dilayani pertama. Bayangkan lebih lanjut bahwa tiket ini memiliki nomor "satu" ditampilkan di atasnya. Tiket berikutnya memiliki nomor "dua" ditampilkan di atasnya. Pelanggan yang membutuhkan tiket kedua akan dilayani kedua. (Jika sistem tiket kami beroperasi seperti tumpukan,
pelanggan yang memasuki tumpukan pertama akan menjadi yang terakhir untuk dilayani!) Sebuah contoh yang lebih praktis dari antrian adalah event-loop dari web browser. Seperti event berbeda yang dipicu, seperti klik tombol, mereka ditambahkan ke event-loop antrian dan ditangani dalam urutan mereka memasuki antrian. Operasi antrianKarena kita sekarang memiliki model konseptual dari suatu antrian, mari kita mendefinisikan operasi. Ketika Anda akan melihat, operasi
antrian sangat mirip dengan tumpukan. Perbedaannya terletak di mana data dihapus.
Penerapan antrianSekarang mari kita menulis kode untuk antrian! Properti antrianUntuk implementasi kami, kami akan membuat constructor yang bernama function Queue() { this._oldestIndex = 1; this._newestIndex = 1; this._storage = {}; } Metode antrianSekarang kita akan menciptakan tiga metode bersama antara semua contoh dari antrian: Metode 1 3: Kami memiliki dua tujuan untuk metode ini:
Queue.prototype.size = function() { return this._newestIndex - this._oldestIndex; }; Menerapkan Menggunakan model konseptual tumpukan, mari kita bayangkan bahwa kami mendorong lima piring ke tumpukan. Ukuran stack kami adalah lima dan setiap piring memiliki nomor yang terkait dengan itu dari satu (pertama ditambahkan piring) hinggi lima (piring terakhir yang ditambahkan). Jika kami menghapus tiga piring, maka kita memiliki dua piring. Kita hanya dapat mengurangi tiga dari lima untuk mendapatkan ukuran yang benar, yang merupakan dua. Berikut adalah titik paling penting tentang ukuran tumpukan: ukuran saat ini mewakili kunci yang bena yang terkait dengan piring di atas tumpukan (2) dan piring lain dalam tumpukan (1). Dengan kata lain, jarak kunci adalah selalu dari ukuran saat ini 1. Sekarang, mari kita menerapkan pelaksanaan susunan Sekarang bayangkan bahwa pelanggan pertama dilayani dan bahwa tiket ini akan dihapus dari antrian. Mirip dengan
tumpukan, kita bisa mendapatkan ukuran yang benar dari antrian kami dengan mengurangi 1 dari 5. Antrian kami saat ini memiliki empat tiket yang belum terlayani. Sekarang, ini adalah mana masalah muncul: ukuran tidak lagi mewakili nomor tiket yang benar. Jika kita hanya mengungi satu dari lima, kita akan memiliki ukuran 4. Kami tidak dapat menggunakan 4 untuk menentukan rentang saat ini tiket tersisa dalam antrian. Apakah kita memiliki tiket dalam antrian dengan angka-angka dari 1 sampai 4 atau
dari 2 sampai 5? Jawabannya tidak jelas. Ini adalah manfaat dari memiliki dua properti berikut dalam antrian: Bayangkan bahwa deli kami memiliki dua sistem tiket:
Inilah konsep yang paling sulit untuk dipahami dalam hal memiliki dua sistem tiket: ketika angka-angka dalam kedua sistem identik, setiap pelanggan dalam antrian telah ditangani dan antrian kosong. Kita akan menggunakan skenario berikut untuk memperkuat logika ini:
Kami sekarang memiliki properti ( Kami telah cukup mengeksplorasi Metode 2 3: Untuk
Berdasarkan kedua tujuan, kita akan membuat pelaksanaan Queue.prototype.enqueue = function(data) { this._storage[this._newestIndex] = data; this._newestIndex++; }; body metode ini mengandung dua baris kode. Pada baris pertama, kami menggunakan Itu adalah semua kode yang kita butuhkan untuk Metode 3 3: Berikut adalah tujuan untuk metode ini:
Queue.prototype.dequeue = function() { var oldestIndex = this._oldestIndex, deletedData = this._storage[oldestIndex]; delete this._storage[oldestIndex]; this._oldestIndex++; return deletedData; }; Di dalam body dari Selanjutnya, kami menghapus index tertua dalam antrian. Setelah itu dihapus, kami menaikan Mirip dengan masalah dalam pelaksanaan Queue.prototype.dequeue = function() { var oldestIndex = this._oldestIndex, newestIndex = this._newestIndex, deletedData; if (oldestIndex !== newestIndex) { deletedData = this._storage[oldestIndex]; delete this._storage[oldestIndex]; this._oldestIndex++; return deletedData; } }; Setiap kali nilai Implementasi lengkap QueueImplementasi lengkap antrian kami. Mari kita lihat seluruh kode. function Queue() { this._oldestIndex = 1; this._newestIndex = 1; this._storage = {}; } Queue.prototype.size = function() { return this._newestIndex - this._oldestIndex; }; Queue.prototype.enqueue = function(data) { this._storage[this._newestIndex] = data; this._newestIndex++; }; Queue.prototype.dequeue = function() { var oldestIndex = this._oldestIndex, newestIndex = this._newestIndex, deletedData; if (oldestIndex !== newestIndex) { deletedData = this._storage[oldestIndex]; delete this._storage[oldestIndex]; this._oldestIndex++; return deletedData; } }; KesimpulanDalam artikel ini, kami sudah menjelajahi dua struktur data linier: tumpukan dan antrian. Tumpukan menyimpan data secara berurutan dan menghapus data paling baru-baru ini ditambahkan; antrian menyimpan data secara berurutan tetapi menghapus data yang ditambahkan paling lama. Jika pelaksanaan struktur data ini tampaknya sepele, mengingatkan diri sendiri tentang tujuan dari struktur data. Mereka tidak dirancang untuk menjadi terlalu rumit; mereka dirancang untuk membantu kami mengatur data. Dalam konteks ini, jika Anda menemukan diri Anda dengan data yang perlu diatur secara berurutan, mempertimbangkan menggunakan stack atau antrian. |