Menu
CoddyTech

Queue (Antrean)

Terakhir diperbarui

Queue adalah struktur data dengan dua ujung yang aktif. Nilai baru masuk di belakang, dan nilai keluar dari depan, jadi yang menunggu paling lama dilayani lebih dulu. Itulah FIFO, dan persis seperti antrean di loket: masuk dari belakang dan dilayani dari depan membuat antreannya adil. Tekan Putar di atas dan lihat nilai masuk dari satu sisi lalu keluar dari sisi lainnya.

Karena setiap ujung dicatat oleh indeks atau pointer-nya sendiri, kedua operasi bernilai O(1) dan tidak ada yang menggeser data lainnya. Itulah sebabnya queue menjadi dasar segala sesuatu yang memproses pekerjaan sesuai urutan kedatangan: antrean cetak, antrean tugas dan pesan, buffer request, dan breadth-first search, yang mengunjungi graf level demi level justru karena menyimpan frontier-nya di dalam queue. Pindahkan ujung pengambilan ke belakang, dan kamu mendapatkan stack.

Kompleksitas waktu dan ruang

Untuk queue yang dibangun di atas ring buffer atau linked list, dua implementasi standarnya:

OperasiKompleksitasCatatan
EnqueueO(1)Tulis di belakang dan majukan indeks belakang.
DequeueO(1)Baca di depan dan majukan indeks depan, tanpa pergeseran.
Peek (depan)O(1)Baca nilai terdepan tanpa mengeluarkannya.
PencarianO(n)Bukan kegunaan queue: kamu harus mengosongkannya untuk melihat isinya.
RuangO(n)Satu slot per nilai yang menunggu.

Langkah demi langkah

LangkahApa yang terjadi
1Queue dimulai dalam keadaan kosong, dengan depan dan belakang menunjuk ke slot yang sama.
2Enqueue menulis nilai di belakang, lalu memajukan posisi belakang satu langkah.
3Setiap enqueue berikutnya masuk di belakang nilai-nilai yang sudah menunggu.
4Dequeue membaca nilai di depan, lalu memajukan posisi depan satu langkah.
5Nilai yang dikembalikan selalu nilai yang sudah menunggu paling lama.
6Saat depan bertemu belakang, queue kosong lagi, dan dequeue lebih lanjut adalah error.

Contoh penerapan

Melakukan enqueue 3, 7, 5, lalu mengosongkan queue:

OperasiQueue (depan ke belakang)Mengembalikan
enqueue(3)[3]tidak ada
enqueue(7)[3, 7]tidak ada
enqueue(5)[3, 7, 5]tidak ada
dequeue()[7, 5]3, nilai paling lama
dequeue()[5]7
dequeue()[]5, nilai paling baru, terakhir

Kapan memakai queue

Pakai saatHindari saat
Pekerjaan harus ditangani sesuai urutan kedatangan: antrean job, buffer request, print spoolerKamu butuh item terbaru lebih dulu, dan itu adalah stack
Kamu menjelajah level demi level, seperti yang dilakukan breadth-first searchItem harus dilayani berdasarkan prioritas, bukan kedatangan, dan untuk itu heap lebih cocok
Producer dan consumer berjalan dengan kecepatan berbeda dan butuh buffer di antara keduanyaKamu perlu mencari atau mengakses lewat indeks ke bagian tengah data
Kamu ingin penyisipan dan pengambilan O(1) tanpa menggeser elemenKamu akan mengimplementasikannya dengan menggeser array di setiap dequeue, yang membuatnya O(n)

Kode Queue

Implementasi Queue yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.

Kode Queue dalam Python

Python
1from collections import deque2
3queue = deque()4
5# Enqueue three values at the rear6for value in [3, 7, 5]:7    queue.append(value)8    print(f"enqueue {value} -> {list(queue)}")9
10# Dequeue them from the front: first in, first out11while queue:12    value = queue.popleft()13    print(f"dequeue {value} -> {list(queue)}")14
15print("empty:", len(queue) == 0)
Jalankan kode ini di Playground Python

FAQ Queue

Apa arti FIFO?
First in, first out (pertama masuk, pertama keluar): nilai yang sudah menunggu paling lama dilayani berikutnya. Antrean di loket tiket adalah gambaran sehari-harinya. Stack memakai aturan kebalikannya, yaitu LIFO.
Apa perbedaan queue dan stack?
Hanya ujung tempat pengambilannya. Keduanya menambahkan di belakang dalam O(1); queue mengambil dari depan (FIFO), sedangkan stack mengambil dari ujung yang sama tempat nilai ditambahkan (LIFO). Selain itu, tabel kompleksitas keduanya sama persis.
Apa saja operasi utama queue?
enqueue menambahkan nilai di belakang, dequeue mengeluarkan dan mengembalikan nilai terdepan, peek (atau front) membaca nilai terdepan tanpa mengeluarkannya, dan is_empty memberi tahu apakah masih ada yang menunggu. Keempatnya bernilai O(1).
Mengapa dequeue lambat jika memakai array biasa?
Karena mengeluarkan indeks 0 dari array menggeser setiap elemen yang tersisa ke kiri, sehingga setiap dequeue bernilai O(n). Implementasi sebenarnya menghindari hal ini dengan ring buffer yang memajukan indeks depan, atau linked list dengan pointer head. collections.deque di Python dan ArrayDeque di Java sudah melakukannya untukmu, sedangkan list.pop(0) tidak.
Apa itu circular queue?
Queue di dalam array berukuran tetap yang indeks depan dan belakangnya berputar kembali ke 0 saat melewati ujung array. Queue ini memakai ulang slot yang dibebaskan oleh dequeue, sehingga queue berkapasitas n bisa terus bekerja tanpa batas alih-alih melewati ujung array.
Di mana queue dipakai dalam program nyata?
Antrean tugas dan pesan antarlayanan, print spooler dan job spooler, buffer request di web server, buffer keyboard dan event, pipeline producer-consumer, dan breadth-first search, di mana queue-lah yang membuat penelusuran berjalan level demi level.
Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai