Bölüm 5: Kuyruklar
Hazırlık
Başlamadan Önce
Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.
FIFO ve enqueue
Eklemenin arkadan, çıkarmanın önden yapıldığını göstermek.
Kuyruk hangi sırayı korur?
Giriş
Öğrenme Çıktıları
Eklemenin arkadan, çıkarmanın önden yapıldığını göstermek.
Boşalan dizi hücrelerini modüler indisle yeniden kullanmak.
ön ve arka göstergelerini tutarlı güncellemek.
Zamanlayıcı, tampon ve BFS örneklerinde kuyruk seçimini gerekçelendirmek.
Temel Kavramlar
İlk giren ilk çıkar
Kuyruk, geliş sırasını korur; hizmet sistemleri ve katman katman dolaşım için doğal modeldir.
x değerini arka uca ekler.
Ön uçtaki değeri çıkarır.
Sıradaki değeri çıkarmadan okur.
İndisler kapasiteye göre mod alınarak başa döner.
Temel Kavramlar
Kavram Haritası
Gösterim
Önden çıkar, arkadan ekle
C ile Gerçekleştirim
Dairesel kuyruk
#define KAPASITE 8
typedef struct {
int veri[KAPASITE];
size_t on, arka, adet;
} Kuyruk;C ile Gerçekleştirim
C'de Bellek ve Sahiplik
Ayrılan belleği hangi yapı veya yordamın bırakacağını baştan belirle.
Yerel değişken adresini fonksiyon dışına taşırma; dinamik belleği gerektiği kadar yaşat.
Boyut, kapasite ve geçerli indisleri her işlemde koru.
NULL, boş yapı ve tek öğe durumlarını özellikle doğrusal dizide boşalan baş hücrelerini kullanmamak riskiyle birlikte test et.
Temel İşlemler
enqueue ve dequeue
bool enqueue(Kuyruk *q, int x) {
if (q->adet == KAPASITE) return false;
q->veri[q->arka] = x;
q->arka = (q->arka + 1) % KAPASITE;
++q->adet;
return true;
}
bool dequeue(Kuyruk *q, int *x) {
if (q->adet == 0) return false;
*x = q->veri[q->on];
q->on = (q->on + 1) % KAPASITE;
--q->adet;
return true;
}Temel İşlemler
Kodu Okurken
Kuyruk hangi sırayı korur?
Her adımda enqueue(x) kuralı korunuyor mu?
Boşalan dizi hücrelerini modüler indisle yeniden kullanmak.
Boş ile dolu durumunu aynı indis çiftine indirgemek
Adım Adım
Dairesel ilerleme
kapasite 5, ön = 3, arka = 0, adet = 2.
9, arka indis 0'a yazılır; arka 1 olur.
ön indis 3'teki değer alınır; ön 4 olur.
Ön veya arka 4'ten sonra (4+1)%5 = 0 ile başa döner.
Sınıf Notu
Dersten Sesler
“Aklınıza gelen ilk çözüm, iyi bir yöntem olmayabilir. Belki n³'lük bir algoritmayı n'e indirebilirsiniz.”
“Depolamak ayrı konudur; o veri üzerinde çalışacak algoritmaların etkinliği ayrı konudur.”
Notlardaki sınıf içi anlatımdan, yazım ve uzunluk bakımından sunuma uyarlanmıştır.
Analiz
Karmaşıklık Özeti
| İşlem | Zaman | Ek bellek |
|---|---|---|
| enqueue | O(1) | O(1) |
| dequeue | O(1) | O(1) |
| front | O(1) | O(1) |
| Değer arama | O(n) | O(1) |
| BFS | O(V+E) | O(V) |
n: öğe sayısı · h: yükseklik · V: düğüm sayısı · E: kenar sayısı
Tasarım Kararı
Hangi Durumda Hangisi?
Sabit kapasite, yüksek hız ve az ayırma işlemi gerekiyorsa.
Kapasite dinamikse; ön ve arka göstergeleri tutulursa.
Her iki uçtan ekleme ve çıkarma gerekiyorsa.
Geliş sırası değil öncelik belirleyiciyse.
Dikkat
Sık Yapılan Hatalar
Alıştırmalar
Kendini Sına
- Kuyruk hangi sırayı korur?
- Dairesel kuyruk neden adet alanı tutabilir?
- Bağlı kuyrukta hangi göstergeler gerekir?
- BFS neden yığın değil kuyruk kullanır?
- Deque ile normal kuyruk arasındaki fark nedir?
Cevapları göster
- FIFO: ilk giren ilk çıkar.
- ön == arka iken boş ve dolu durumlarını ayırmak için.
- Ön ve arka.
- Düğümleri keşfedildikleri katman sırasıyla işlemek için.
- Deque her iki uçtan ekleme ve çıkarma sağlar.
Uygulama
Mini Laboratuvar
Kuyruk hangi sırayı korur?
Bağlı kuyrukta hangi göstergeler gerekir?
Deque ile normal kuyruk arasındaki fark nedir?
Özet
Bölüm Özeti
İşler geliş sırasıyla yürür.
Boşalan hücreler yeniden kullanılır.
Ekleme arka, çıkarma ön uçtadır.
Özet
Kaynaklar ve Devam
- Veri Yapıları ve Algoritmalar 1, PDF s. 25-31
- Horowitz, Sahni ve Anderson-Freed, Fundamentals of Data Structures in C.
- Kernighan ve Ritchie, The C Programming Language.