Menu
Coddy logo textTech

Queue (Kuyruk)

Son güncelleme

Bir queue (kuyruk) iki ucundan da canlıdır. Yeni değerler sondan katılır, değerler baştan ayrılır; böylece en uzun bekleyen ilk hizmeti alır. FIFO budur ve bir gişedeki sıranın davranışı da tam olarak böyledir: arkadan katılıp önden hizmet almak, beklemeyi adil kılan şeydir. Yukarıdan Oynat'a basın; değerlerin bir taraftan girip diğer taraftan çıkmasını izleyin.

Her uç kendi indeksi veya işaretçisiyle izlendiği için iki işlem de O(1)'dir ve hiçbiri verinin geri kalanını kaydırmaz. İşi geliş sırasına göre işleyen her şeyin altında bu yüzden bir kuyruk vardır: yazdırma işleri, görev ve mesaj kuyrukları, istek tamponları ve grafı seviye seviye gezen genişlik öncelikli arama, ki bunu tam olarak sınırını bir kuyrukta tuttuğu için yapar. Çıkarmanın yapıldığı ucu arkaya taşıyın, elinizde bunun yerine bir stack olur.

Zaman ve alan karmaşıklığı

İki standart uygulama olan dairesel tampon (ring buffer) veya bağlı liste tabanlı bir kuyruk için:

İşlemKarmaşıklıkNotlar
Enqueue (sona ekleme)O(1)Değeri sona yazar ve son indeksini ilerletir.
Dequeue (baştan çıkarma)O(1)Baştaki değeri okur ve baş indeksini ilerletir, hiçbir kaydırma olmadan.
Peek (başa bakma)O(1)Baştaki değeri çıkarmadan okur.
AramaO(n)Kuyruk bunun için değildir: içine bakmak için onu boşaltmanız gerekir.
AlanO(n)Bekleyen her değer için bir yuva.

Adım adım

AdımNe olur
1Kuyruk boş başlar; baş ve son aynı yuvayı gösterir.
2Enqueue değeri sona yazar, ardından sonu bir ilerletir.
3Sonraki her enqueue, zaten bekleyen değerlerin arkasına oturur.
4Dequeue baştaki değeri okur, ardından başı bir ilerletir.
5Geri dönen değer daima en uzun bekleyen değerdir.
6Baş ile son buluştuğunda kuyruk yeniden boşalmıştır ve bir çıkarma daha yapmak hatadır.

Çözümlü örnek

3, 7, 5 değerlerini ekleyip ardından kuyruğu boşaltma:

İşlemKuyruk (baştan sona)Döndürdüğü
enqueue(3)[3]hiçbir şey
enqueue(7)[3, 7]hiçbir şey
enqueue(5)[3, 7, 5]hiçbir şey
dequeue()[7, 5]3, en eski değer
dequeue()[5]7
dequeue()[]5, en yeni değer, en sonda

Queue ne zaman kullanılır

Şu durumlarda kullanınŞu durumlarda kaçının
İşler geliş sırasına göre ele alınmalıysa: iş kuyrukları, istek tamponları, yazdırma spoolerlarıEn son eklenen öğeye önce ihtiyacınız varsa; bunun için bir stack vardır
Genişlik öncelikli aramanın yaptığı gibi seviye seviye keşfediyorsanızÖğeler geliş sırasına göre değil önceliğe göre işlenmeliyse; burada bir heap uygundur
Bir üretici ile bir tüketici farklı hızlarda çalışıyor ve aralarında bir tampona ihtiyaç duyuyorsaVerinin ortasında arama yapmanız veya indeksle erişmeniz gerekiyorsa
Elemanları kaydırmadan O(1) ekleme ve çıkarma istiyorsanızOnu her dequeue işleminde diziyi kaydırarak gerçekleyecekseniz; bu onu O(n) yapar

Queue kodu

Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Queue uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.

Python ile Queue kodu

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)
Bu kodu Python Playground'da çalıştır

Queue SSS

FIFO ne demek?
First in, first out, yani ilk giren ilk çıkar: en uzun bekleyen değer, sırada hizmet alacak olandır. Günlük hayattaki karşılığı bir bilet gişesindeki sıradır. Bir stack ise tam tersi kurala, LIFO'ya uyar.
Queue ile stack arasındaki fark nedir?
Yalnızca hangi uçtan çıkardığınız. İkisi de sondan O(1) ile ekler; queue baştan çıkarır (FIFO), stack ise eklediği uçtan çıkarır (LIFO). Bunun dışında karmaşıklık tabloları aynıdır.
Kuyruğun temel işlemleri nelerdir?
enqueue sona bir değer ekler, dequeue baştaki değeri çıkarıp döndürür, peek (veya front) baştaki değeri çıkarmadan okur ve is_empty bekleyen bir şey olup olmadığını bildirir. Dördü de O(1)'dir.
Düz bir dizi kullanırsam dequeue neden yavaş olur?
Çünkü bir dizide 0 indeksini silmek kalan tüm elemanları sola kaydırır ve her dequeue işlemini O(n) yapar. Gerçek uygulamalar bunu, baş indeksini ilerleten bir dairesel tamponla ya da baş işaretçisi olan bir bağlı listeyle önler. Python'daki collections.deque ve Java'daki ArrayDeque bunu sizin için yapar, list.pop(0) ise yapmaz.
Dairesel kuyruk nedir?
Baş ve son indekslerinin dizinin sonuna vardıklarında 0'a geri döndüğü, sabit boyutlu bir dizideki kuyruktur. Çıkarmaların boşalttığı yuvaları yeniden kullanır; böylece n kapasiteli bir kuyruk, dizinin sonundan taşmak yerine süresiz olarak çalışmayı sürdürür.
Gerçek programlarda kuyruklar nerede kullanılır?
Servisler arasındaki görev ve mesaj kuyrukları, yazdırma ve iş spoolerları, web sunucularındaki istek tamponları, klavye ve olay tamponları, üretici-tüketici hatları ve kuyruğun dolaşmayı seviye seviye ilerleten unsur olduğu genişlik öncelikli arama.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA