Bölüm 5: Kuyruk

Bölüm 5: Kuyruk · Çalışma Soruları
Queue ve Stack birlikteDairesel kuyrukHata bulmaDequeYığın mı kuyruk mu?
Klasik · çoktan seçmeli · adım adım çalıştırmalı · ucu açık sorular. Önce kendiniz çözün, sonra cevabı açın. · Sercan KÜLCÜ

Klasik Soru · Kuyruk

Soru 1: Kuyruk ve Yığın Çıktısı

Programın çıktısı nedir?

Queue<Integer> q = new LinkedList<>();
Stack<Integer> s = new Stack<>();
for (int i = 1; i <= 5; i++)
    q.offer(i * 2);
for (int i = 0; i < 2; i++)
    s.push(q.poll());
q.offer(s.pop());
q.offer(s.pop());
System.out.println(q.peek() + " " + q
                   + " " + s.isEmpty());
Cevabı göster
  • q = [2, 4, 6, 8, 10]
  • İki poll 2 ve 4'ü önden alır, yığına koyar: s = [2, 4], q = [6, 8, 10]
  • s.pop() önce 4'ü, sonra 2'yi verir; ikisi kuyruğun sonuna eklenir: q = [6, 8, 10, 4, 2]

Çıktı: 6 [6, 8, 10, 4, 2] true

Not: yığından geçen elemanların sırası ters döner. Tüm kuyruk yığından geçirilseydi kuyruk tamamen ters çevrilirdi.

Klasik Soru · Kuyruk

Soru 2: Dairesel Kuyruk İzleme

Kapasitesi 5 olan dizi tabanlı dairesel kuyruk bas = 0, boyut = 0 ile başlıyor; ekleme indisi (bas + boyut) % 5. Sırasıyla: ekle A, B, C, D; cikar; cikar; ekle E, F, G; ekle H.
Dizinin son hâli, bas ve boyut nedir? Dairesel olmayan kuyrukta ne olurdu?

Cevabı göster
İşlemDizi [0..4]basboyut
ekle A–DA B C D _04
cikar → A_ B C D _13
cikar → B_ _ C D _22
ekle E (indis 4)_ _ C D E23
ekle F (indis 0)F _ C D E24
ekle G (indis 1)F G C D E25
ekle Hdolu → eklenemez25

Son durum: [F, G, C, D, E], bas = 2, boyut = 5. Çıkış sırası: C, D, E, F, G.

Doğrusal kuyrukta son = 4 olduktan sonra F eklenemezdi; baştaki iki boş hücre kullanılamaz (bellek israfı). Dairesel kuyruk mod ile başa sarar.

Klasik Soru · Kuyruk

Soru 3: Hatayı Bulun

Bağlı liste ile kuyruk gerçekleyen ekle ve cikar metotlarında hatalar var. Hangi işlem sırasında ne olur? Düzeltiniz.

public void ekle(E e) {
    Dugum<E> yeni = new Dugum<>(e);
    if (bas == null) bas = yeni;
    else son.sonraki = yeni;
    boyut++;
}
public E cikar() {
    if (bas == null)
        throw new RuntimeException("Boş");
    E veri = bas.veri;
    bas = bas.sonraki;
    boyut--;
    return veri;
}
Cevabı göster

Hata 1: son hiç güncellenmiyor. İlk ekle'de bas atanır ama son null kalır; ikinci ekle'de son.sonraki → NullPointerException.

Hata 2: Son eleman çıkarıldığında bas null olur ama son, çıkarılan düğümü göstermeye devam eder (gereksiz referans).

public void ekle(E e) {
    Dugum<E> yeni = new Dugum<>(e);
    if (bas == null) bas = yeni;
    else son.sonraki = yeni;
    son = yeni;                 // eklendi
    boyut++;
}
// cikar: bas ilerletildikten sonra
if (bas == null) son = null;    // eklendi

Klasik Soru · Kuyruk

Soru 4: Deque Çıktısı

ArrayDeque iki uçlu kuyruktur. Programın çıktısı nedir?

Deque<String> d = new ArrayDeque<>();
d.offerFirst("A");
d.offerLast("B");
d.push("C");
d.addLast("D");
System.out.print(d.pollLast() + " ");
System.out.print(d.pop() + " ");
d.offerFirst("E");
System.out.print(d.peekLast() + " " + d);
Cevabı göster
  • offerFirst A → [A]; offerLast B → [A, B]
  • push = addFirst → [C, A, B]; addLast D → [C, A, B, D]
  • pollLast → D; pop = removeFirst → C; deque [A, B]
  • offerFirst E → [E, A, B]; peekLast → B

Çıktı: D C B [E, A, B]

Deque hem yığın (push/pop baştan) hem kuyruk (offerLast/pollFirst) olarak kullanılabilir.

Klasik Soru · Kuyruk

Soru 5: Yığın mı, Kuyruk mu?

Her durum için yığın (LIFO) ya da kuyruk (FIFO) seçiniz ve gerekçe yazınız.

  1. Çizgede genişlik öncelikli arama (BFS)
  2. Çizgede derinlik öncelikli arama (DFS, özyinelemesiz)
  3. Tarayıcıdaki "geri" düğmesi
  4. İşletim sisteminde round-robin işlemci zamanlaması
  5. Özyinelemeli fonksiyon çağrıları
  6. Klavye tamponundaki tuş vuruşları
Cevabı göster
  1. Kuyruk: önce yakın düğümler, katman katman ziyaret edilir.
  2. Yığın: en son bulunan düğümden derine inilir, çıkmazda geri dönülür.
  3. Yığın: en son ziyaret edilen sayfaya ilk dönülür.
  4. Kuyruk: süresi biten süreç kuyruğun sonuna eklenir, sıradaki çalışır.
  5. Yığın (çağrı yığını): en son çağrılan fonksiyon ilk döner.
  6. Kuyruk: tuşlar basıldığı sırayla işlenmelidir.

Çoktan Seçmeli · Kuyruk

Test 1

Boş kuyruğa 1, 2, 3 eklenir; bir eleman çıkarılır; 4 eklenir. Önde (peek) hangi eleman vardır?

FIFO: ilk çıkan 1'dir. Kuyruk [2, 3, 4] → önde 2.

Dizi tabanlı dairesel kuyrukta (kapasite N, bas, boyut) yeni eleman hangi indise yazılır?

Son elemandan sonraki hücre; dizinin sonuna gelince mod ile başa sarılır.

Çoktan Seçmeli · Kuyruk

Test 2

Boş bir Queue<Integer> q = new LinkedList<>() için q.peek() ne döndürür?

peek/poll boş kuyrukta null döndürür; element/remove ise NoSuchElementException fırlatır.

Çizgede genişlik öncelikli arama (BFS) hangi yapıyı kullanır?

BFS düğümleri keşfedildikleri sırayla (katman katman) işler: FIFO → kuyruk. DFS yığın kullanır.

Adım Adım Çalıştırma · Kuyruk

Dairesel Kuyruk

Kapasitesi 4 olan dairesel kuyrukta işlemleri izleyin. bas ve ekleme konumu nasıl başa sarar?

00bas ekle→010203

Önce tahmin edin: en sondaki cikar() ne döndürür?

00bas ekle→010203

Dizi 0'larla dolu ama mantıksal olarak boş.

100bas01ekle→0203

ekle(10): indis (0 + 0) % 4 = 0.

100bas20102ekle→03

ekle(20): indis (0 + 1) % 4 = 1.

100bas20130203ekle→

ekle(30): indis (0 + 2) % 4 = 2.

100201bas30203ekle→

cikar() → 10; bas 0 → 1. Değer dizide kalır ama artık kuyrukta değildir.

100201302bas03ekle→

cikar() → 20; bas 1 → 2. Değer dizide kalır ama artık kuyrukta değildir.

100ekle→201302bas403

ekle(40): indis (2 + 1) % 4 = 3.

500201ekle→302bas403

ekle(50): indis (2 + 2) % 4 = 0. Dizinin sonu geçildi, başa sarıldı.

500601302bas403

ekle(60): indis (2 + 3) % 4 = 1. Dizinin sonu geçildi, başa sarıldı. Kuyruk doldu.

500601302ekle→403bas

cikar() → 30 yazdırılır. Kuyrukta 3 eleman kaldı.

int[] d = new int[4];
int bas = 0, boyut = 0;
void ekle(int x) {
    d[(bas + boyut) % d.length] = x;
    boyut++;
}
int cikar() {
    int x = d[bas];
    bas = (bas + 1) % d.length;
    boyut--;
    return x;
}
// ekle(10); ekle(20); ekle(30);
// cikar(); cikar();
// ekle(40); ekle(50); ekle(60);
// System.out.println(cikar());

Ucu Açık Soru · Kuyruk

Öncelikli Müşteriler

  1. Bir banka şubesinde normal müşterilerin yanında öncelikli müşteriler (yaşlı, engelli, hamile) de var. Tek bir FIFO kuyruğu neden yetmez? Bir tasarım önerin.
  2. Öncelikli müşteriler sürekli gelirse normal müşteriler hiç çağrılmayabilir (açlık, starvation). Bunu nasıl önlersiniz?
Örnek cevap ve değerlendirme ölçütleri

1. Tek FIFO kuyruğu yalnızca geliş sırasını bilir, önceliği bilmez. Seçenekler: (a) iki ayrı kuyruk: önce öncelikli kuyruk boşaltılır; (b) öncelikli kuyruk (heap): anahtar (öncelik, sıra no). Sıra numarası aynı öncelikte FIFO'yu korur.

2. Önlemler: oran kuralı (ör. 2 öncelikli, 1 normal sırayla); yaşlandırma (aging): bekleme süresi arttıkça önceliği yükselt; azami bekleme süresi aşılınca öne al. İşletim sistemi zamanlayıcıları da benzer yöntemler kullanır.

Değerlendirme: FIFO'nun sınırını açıklama · uygun yapı (çoklu kuyruk / heap) · eşit öncelikte adalet · açlığa karşı somut kural.

Son

Bölüm 5: Kuyruk: Çalışma Soruları
Konu anlatımı: Kuyruk sunumu
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.