Bölüm 5: Kuyruk
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
poll2 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
| İşlem | Dizi [0..4] | bas | boyut |
|---|---|---|---|
| ekle A–D | A B C D _ | 0 | 4 |
| cikar → A | _ B C D _ | 1 | 3 |
| cikar → B | _ _ C D _ | 2 | 2 |
| ekle E (indis 4) | _ _ C D E | 2 | 3 |
| ekle F (indis 0) | F _ C D E | 2 | 4 |
| ekle G (indis 1) | F G C D E | 2 | 5 |
| ekle H | dolu → eklenemez | 2 | 5 |
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.
- Çizgede genişlik öncelikli arama (BFS)
- Çizgede derinlik öncelikli arama (DFS, özyinelemesiz)
- Tarayıcıdaki "geri" düğmesi
- İşletim sisteminde round-robin işlemci zamanlaması
- Özyinelemeli fonksiyon çağrıları
- Klavye tamponundaki tuş vuruşları
Cevabı göster
- Kuyruk: önce yakın düğümler, katman katman ziyaret edilir.
- Yığın: en son bulunan düğümden derine inilir, çıkmazda geri dönülür.
- Yığın: en son ziyaret edilen sayfaya ilk dönülür.
- Kuyruk: süresi biten süreç kuyruğun sonuna eklenir, sıradaki çalışır.
- Yığın (çağrı yığını): en son çağrılan fonksiyon ilk döner.
- 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?
Önce tahmin edin: en sondaki cikar() ne döndürür?
Dizi 0'larla dolu ama mantıksal olarak boş.
ekle(10): indis (0 + 0) % 4 = 0.
ekle(20): indis (0 + 1) % 4 = 1.
ekle(30): indis (0 + 2) % 4 = 2.
cikar() → 10; bas 0 → 1. Değer dizide kalır ama artık kuyrukta değildir.
cikar() → 20; bas 1 → 2. Değer dizide kalır ama artık kuyrukta değildir.
ekle(40): indis (2 + 1) % 4 = 3.
ekle(50): indis (2 + 2) % 4 = 0. Dizinin sonu geçildi, başa sarıldı.
ekle(60): indis (2 + 3) % 4 = 1. Dizinin sonu geçildi, başa sarıldı. Kuyruk doldu.
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
- 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.
- Ö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.