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

$ queue --interactive

Bir değer yazıp enqueue ile sona (rear) ekle; dequeue ile öndeki (front) elemanı çıkar.

Eleman: 3/8GeziliyorYeniÇıkarılıyorBulundu / okunan

#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

İşlemSüre
enqueueO(1)
dequeueO(1)
peekO(1)
Bir değeri aramakO(n)
BellekO(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

1/3

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

Orta

1/1

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

1/1

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: