Bölüm 5: Kuyruklar

FIFO, dairesel tampon ve hizmet sırası
FIFOenqueuedequeueDairesel diziBağlı kuyrukUygulamalar
C ile Veri Yapıları · İki ciltlik ders notları temel alınmıştır

Hazırlık

Başlamadan Önce

C ön bilgisi

Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.

İlk kavram

FIFO ve enqueue

Bu bölümün hedefi

Eklemenin arkadan, çıkarmanın önden yapıldığını göstermek.

Başlangıç sorusu

Kuyruk hangi sırayı korur?

Giriş

Öğrenme Çıktıları

FIFO'yu açıklamak

Eklemenin arkadan, çıkarmanın önden yapıldığını göstermek.

Dairesel yapı kurmak

Boşalan dizi hücrelerini modüler indisle yeniden kullanmak.

Bağlı kuyruk yazmak

ön ve arka göstergelerini tutarlı güncellemek.

Uygulamak

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.

enqueue(x)

x değerini arka uca ekler.

dequeue()

Ön uçtaki değeri çıkarır.

front()

Sıradaki değeri çıkarmadan okur.

Dairesel tampon

İndisler kapasiteye göre mod alınarak başa döner.

Temel Kavramlar

Kavram Haritası

1FIFO
2enqueue
3dequeue
4Dairesel dizi
5Bağlı kuyruk
6Uygulamalar
Kuyruk, geliş sırasını korur; hizmet sistemleri ve katman katman dolaşım için doğal modeldir.

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;
Tür tanımı veri yapısının bellekteki biçimini; yordamlar ise bu yapı üzerindeki davranışı kurar.

C ile Gerçekleştirim

C'de Bellek ve Sahiplik

Sahip kim?

Ayrılan belleği hangi yapı veya yordamın bırakacağını baştan belirle.

Yaşam süresi

Yerel değişken adresini fonksiyon dışına taşırma; dinamik belleği gerektiği kadar yaşat.

Sınırlar

Boyut, kapasite ve geçerli indisleri her işlemde koru.

Boş durum

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;
}
Kod örnekleri C99/C11 uyumlu olacak biçimde küçük ve tek sorumluluklu tutulmuştur.

Temel İşlemler

Kodu Okurken

Ön koşul

Kuyruk hangi sırayı korur?

Değişmez

Her adımda enqueue(x) kuralı korunuyor mu?

Son koşul

Boşalan dizi hücrelerini modüler indisle yeniden kullanmak.

Hata yolu

Boş ile dolu durumunu aynı indis çiftine indirgemek

Adım Adım

Dairesel ilerleme

Başlangıç

kapasite 5, ön = 3, arka = 0, adet = 2.

enqueue(9)

9, arka indis 0'a yazılır; arka 1 olur.

dequeue

ön indis 3'teki değer alınır; ön 4 olur.

Sarma

Ö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

İşlemZamanEk bellek
enqueueO(1)O(1)
dequeueO(1)O(1)
frontO(1)O(1)
Değer aramaO(n)O(1)
BFSO(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?

Dairesel dizi

Sabit kapasite, yüksek hız ve az ayırma işlemi gerekiyorsa.

Bağlı kuyruk

Kapasite dinamikse; ön ve arka göstergeleri tutulursa.

Deque

Her iki uçtan ekleme ve çıkarma gerekiyorsa.

Öncelik kuyruğu

Geliş sırası değil öncelik belirleyiciyse.

Dikkat

Sık Yapılan Hatalar

1Doğrusal dizide boşalan baş hücrelerini kullanmamak
2Boş ile dolu durumunu aynı indis çiftine indirgemek
3Son düğüm silindiğinde arka göstergesini NULL yapmamak
4Mod alma işleminde yanlış kapasite kullanmak

Alıştırmalar

Kendini Sına

  1. Kuyruk hangi sırayı korur?
  2. Dairesel kuyruk neden adet alanı tutabilir?
  3. Bağlı kuyrukta hangi göstergeler gerekir?
  4. BFS neden yığın değil kuyruk kullanır?
  5. Deque ile normal kuyruk arasındaki fark nedir?
Cevapları göster
  1. FIFO: ilk giren ilk çıkar.
  2. ön == arka iken boş ve dolu durumlarını ayırmak için.
  3. Ön ve arka.
  4. Düğümleri keşfedildikleri katman sırasıyla işlemek için.
  5. Deque her iki uçtan ekleme ve çıkarma sağlar.

Uygulama

Mini Laboratuvar

1 · Çiz

Kuyruk hangi sırayı korur?

2 · Kodla

Bağlı kuyrukta hangi göstergeler gerekir?

3 · Ölç

Deque ile normal kuyruk arasındaki fark nedir?

Teslim: küçük bir C modülü, üç uç test ve zaman/bellek karmaşıklığı tablosu.

Özet

Bölüm Özeti

Sıra korunur

İşler geliş sırasıyla yürür.

Dairesel indis

Boşalan hücreler yeniden kullanılır.

Doğru uçlar

Ekleme arka, çıkarma ön uçtadır.

Özet

Kaynaklar ve Devam

Son

Bölüm 5: Kuyruklar
Ders planına dön
1 / 1 C ile Veri Yapıları

← → veya boşluk ile gezinin · F: tam ekran · Home/End: ilk/son slayt