Bölüm 4: Yığınlar
Hazırlık
Başlamadan Önce
Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.
LIFO ve push
Ekleme ve çıkarmanın yalnız üst uçtan yapıldığını göstermek.
Yığın neden LIFO olarak adlandırılır?
Giriş
Öğrenme Çıktıları
Ekleme ve çıkarmanın yalnız üst uçtan yapıldığını göstermek.
Dizi ve bağlı liste tabanlı yığınları karşılaştırmak.
Taşma ve boş yığından alma durumlarını güvenle ele almak.
Parantez denetimi, geri alma ve özyineleme ilişkisini kurmak.
Temel Kavramlar
Son giren ilk çıkar
Yığın yalnızca üstteki öğeyi görünür kılar; bu kısıt bazı problemleri belirgin biçimde sadeleştirir.
x değerini üste ekler.
Üstteki değeri çıkarıp döndürür.
Üstteki değeri çıkarmadan okur.
Alt sınır durumunu bildirir.
Temel Kavramlar
Kavram Haritası
Gösterim
Üst uç tek giriş ve çıkış noktasıdır
C ile Gerçekleştirim
Dizi tabanlı yığın
#define KAPASITE 64
typedef struct {
int veri[KAPASITE];
int ust; /* boşken -1 */
} Yigin;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 boş yığından pop yapmak riskiyle birlikte test et.
Temel İşlemler
push ve pop
bool push(Yigin *y, int x) {
if (y->ust == KAPASITE - 1) return false;
y->veri[++y->ust] = x;
return true;
}
bool pop(Yigin *y, int *sonuc) {
if (y->ust < 0) return false;
*sonuc = y->veri[y->ust--];
return true;
}Temel İşlemler
Kodu Okurken
Yığın neden LIFO olarak adlandırılır?
Her adımda push(x) kuralı korunuyor mu?
Dizi ve bağlı liste tabanlı yığınları karşılaştırmak.
Dolu sabit dizide push yapmak
Adım Adım
Parantez denetimi: (a+[b*c])
Açan parantezi yığına koy: [(
Yeni açanı üste koy: [(, [
Üstte [ var; eşleştiği için pop.
Üstte ( var; pop. Girdi bittiğinde yığın boş: ifade dengeli.
Sınıf Notu
Dersten Sesler
“Ya hu bu bir stack yapısı! Ne kadar estetik anlattık! Öyleyse bir yığıt kullanacağız.”
“Analizini bile beceremediğin algoritmaya burun kıvırma! Problemi önce araştır; o soru defalarca çözülmüştür.”
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 |
|---|---|---|
| push | O(1) | O(1) |
| pop | O(1) | O(1) |
| peek | O(1) | O(1) |
| n karakter parantez denetimi | O(n) | O(n) |
| Yığını boşaltma | O(n) | O(1) |
n: öğe sayısı · h: yükseklik · V: düğüm sayısı · E: kenar sayısı
Tasarım Kararı
Hangi Durumda Hangisi?
Üst sınır biliniyor ve düşük ek yük isteniyorsa.
Amortize O(1) push ve iyi önbellek davranışı isteniyorsa.
Kapasite önceden bilinmiyor ve düğüm ayırma maliyeti kabul edilebiliyorsa.
Fonksiyonların dönüş adresi ve yerel durumlarını doğal olarak saklar.
Dikkat
Sık Yapılan Hatalar
Alıştırmalar
Kendini Sına
- Yığın neden LIFO olarak adlandırılır?
- push işleminde önce mi sonra mı ust artırılır?
- Parantez denetiminde kapanan parantez neyle karşılaştırılır?
- Özyineleme yığınla nasıl ilişkilidir?
- Bağlı yığında push hangi uçta yapılmalıdır?
Cevapları göster
- En son eklenen öğe ilk çıkarılır.
- Tanıma göre değişebilir; burada boş değer -1 olduğu için önce artırılır.
- Yığının üstündeki son açan parantezle.
- Her çağrı dönüş adresi ve yerel değişkenlerle çağrı yığınına bir çerçeve ekler.
- Başta; böylece O(1) kalır.
Uygulama
Mini Laboratuvar
Yığın neden LIFO olarak adlandırılır?
Parantez denetiminde kapanan parantez neyle karşılaştırılır?
Bağlı yığında push hangi uçta yapılmalıdır?
Özet
Bölüm Özeti
Tüm temel işlemler üstte yapılır.
push, pop ve peek O(1).
Geri alma, ayrıştırma ve çağrı yönetimi için güçlüdür.
Özet
Kaynaklar ve Devam
- Veri Yapıları ve Algoritmalar 1, PDF s. 25-32
- Horowitz, Sahni ve Anderson-Freed, Fundamentals of Data Structures in C.
- Kernighan ve Ritchie, The C Programming Language.