Kuyruk (Queue)
İlk giren elemanın ilk çıktığı (FIFO) veri yapısı.
#Nasıl çalışır?
Kuyruk (queue), elemanların bir uçtan girip diğer uçtan çıktığı bir veri yapısıdır; bir market kasasındaki sıra gibi. Yeni gelen sona (rear) geçer, işlem sırası öndekine (front) gelir.
Bu kurala FIFO (First In, First Out: ilk giren ilk çıkar) denir. Elemanlar geliş sırasıyla işlenir.
Kuyruklar genellikle bağlı liste ya da dairesel dizi (circular buffer) ile gerçeklenir; böylece hem ekleme hem çıkarma O(1) olur.
#Kendin dene
Bir değer yazıp enqueue ile sona (rear) ekle; dequeue ile öndeki (front) elemanı çıkar.
#Temel işlemler
- enqueue(x)
- x değerini kuyruğun sonuna (rear) ekler.
- dequeue()
- Öndeki (front) elemanı çıkarır ve döndürür. Kuyruk boşsa hata verir.
- peek() / front()
- Öndeki elemanı çıkarmadan okur.
- isEmpty()
- Kuyrukta eleman olup olmadığını söyler.
#Örnek kod
Aynı algoritma 8 dilde. Her program derlenip çalıştırılarak test edildi ve hepsi aynı çıktıyı veriyor.
class Queue:
"""Circular buffer: front and rear wrap around, so nothing is ever shifted."""
def __init__(self, capacity: int) -> None:
self._items = [0] * capacity
self._front = 0
self._size = 0
def enqueue(self, value: int) -> None:
if self._size == len(self._items):
raise OverflowError("queue is full")
self._items[(self._front + self._size) % len(self._items)] = value
self._size += 1
def dequeue(self) -> int:
value = self.peek()
self._front = (self._front + 1) % len(self._items)
self._size -= 1
return value
def peek(self) -> int:
if self._size == 0:
raise IndexError("queue is empty")
return self._items[self._front]
def __len__(self) -> int:
return self._size
q = Queue(8)
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
print(q.dequeue()) # 1: first in, first out
print(q.peek()) # 2
print(len(q)) # 2#Karmaşıklık
| İşlem | Süre |
|---|---|
| enqueue | O(1) |
| dequeue | O(1) |
| peek | O(1) |
| Bir değeri aramak | O(n) |
| Bellek | O(n) |
Dairesel dizi ya da bağlı listeyle ekleme ve çıkarma sabit sürededir. Basit bir dizide öndeki elemanı silip kalanları kaydırmak O(n) olurdu; dairesel dizi bunu front ve rear indekslerini ilerleterek önler. Animasyonda elemanların kayması, mantıksal sırayı göstermek içindir.
#Ne zaman kullanılır?
İş kuyrukları, yazıcı kuyruğu, mesaj kuyrukları (ör. RabbitMQ), işletim sistemindeki görev zamanlama, veri akışı tamponları ve genişlik öncelikli arama (BFS) kuyruk kullanır. "Gelen sırayla işle" gereken her yerde kuyruk doğru seçimdir.
#Alıştırma
Soruları cevaplamak ve ilerlemeni kaydetmek için giriş yap.
Kolay
Kuyruk hangi kurala göre çalışır?
- 1FIFO: ilk giren ilk çıkar
- 2LIFO: son giren ilk çıkar
- 3En büyük önce çıkar
- 4Rastgele çıkar
enqueue işlemi elemanı nereye ekler?
- 1Kuyruğun sonuna (rear)
- 2Kuyruğun önüne (front)
- 3Ortaya
- 4Sıralı yerine
Dairesel dizi (circular buffer) ile gerçeklenen bir kuyrukta dequeue'nun karmaşıklığı nedir?
- 1O(1)
- 2O(n)
- 3O(log n)
- 4O(n log n)
Orta
Boş bir kuyruğa sırasıyla enqueue(1), enqueue(2), dequeue(), enqueue(3), dequeue() yapılırsa geriye ne kalır?
- 1[3]
- 2[1]
- 3[2, 3]
- 4[1, 3]
Zor
Genişlik öncelikli arama (BFS) hangi veri yapısını kullanır?
- 1Kuyruk
- 2Yığın
- 3Bağlı liste
- 4Hash tablosu
#Bundan sonra
Bu dersi bildiğini varsayan dersler: