Bölüm 4: Yığınlar

LIFO, çağrı yığını ve ifade işleme
LIFOpushpopDiziBağlı yığınUygulamalar
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

LIFO ve push

Bu bölümün hedefi

Ekleme ve çıkarmanın yalnız üst uçtan yapıldığını göstermek.

Başlangıç sorusu

Yığın neden LIFO olarak adlandırılır?

Giriş

Öğrenme Çıktıları

LIFO'yu açıklamak

Ekleme ve çıkarmanın yalnız üst uçtan yapıldığını göstermek.

İki gerçekleştirim kurmak

Dizi ve bağlı liste tabanlı yığınları karşılaştırmak.

Hataları yönetmek

Taşma ve boş yığından alma durumlarını güvenle ele almak.

Uygulamak

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.

push(x)

x değerini üste ekler.

pop()

Üstteki değeri çıkarıp döndürür.

peek()

Üstteki değeri çıkarmadan okur.

is_empty()

Alt sınır durumunu bildirir.

Temel Kavramlar

Kavram Haritası

1LIFO
2push
3pop
4Dizi
5Bağlı yığın
6Uygulamalar
Yığın yalnızca üstteki öğeyi görünür kılar; bu kısıt bazı problemleri belirgin biçimde sadeleştirir.

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

Temel İşlemler

Kodu Okurken

Ön koşul

Yığın neden LIFO olarak adlandırılır?

Değişmez

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

Son koşul

Dizi ve bağlı liste tabanlı yığınları karşılaştırmak.

Hata yolu

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

İşlemZamanEk bellek
pushO(1)O(1)
popO(1)O(1)
peekO(1)O(1)
n karakter parantez denetimiO(n)O(n)
Yığını boşaltmaO(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?

Dizi tabanlı

Üst sınır biliniyor ve düşük ek yük isteniyorsa.

Dinamik dizi

Amortize O(1) push ve iyi önbellek davranışı isteniyorsa.

Bağlı yığın

Kapasite önceden bilinmiyor ve düğüm ayırma maliyeti kabul edilebiliyorsa.

Çağrı yığını

Fonksiyonların dönüş adresi ve yerel durumlarını doğal olarak saklar.

Dikkat

Sık Yapılan Hatalar

1Boş yığından pop yapmak
2Dolu sabit dizide push yapmak
3ust değerini öğe sayısıyla karıştırmak
4Bağlı yığında pop edilen düğümü free etmemek

Alıştırmalar

Kendini Sına

  1. Yığın neden LIFO olarak adlandırılır?
  2. push işleminde önce mi sonra mı ust artırılır?
  3. Parantez denetiminde kapanan parantez neyle karşılaştırılır?
  4. Özyineleme yığınla nasıl ilişkilidir?
  5. Bağlı yığında push hangi uçta yapılmalıdır?
Cevapları göster
  1. En son eklenen öğe ilk çıkarılır.
  2. Tanıma göre değişebilir; burada boş değer -1 olduğu için önce artırılır.
  3. Yığının üstündeki son açan parantezle.
  4. Her çağrı dönüş adresi ve yerel değişkenlerle çağrı yığınına bir çerçeve ekler.
  5. Başta; böylece O(1) kalır.

Uygulama

Mini Laboratuvar

1 · Çiz

Yığın neden LIFO olarak adlandırılır?

2 · Kodla

Parantez denetiminde kapanan parantez neyle karşılaştırılır?

3 · Ölç

Bağlı yığında push hangi uçta yapılmalıdır?

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

Özet

Bölüm Özeti

Tek uç

Tüm temel işlemler üstte yapılır.

Sabit maliyet

push, pop ve peek O(1).

Durum saklama

Geri alma, ayrıştırma ve çağrı yönetimi için güçlüdür.

Özet

Kaynaklar ve Devam

Son

Bölüm 4: Yığınlar
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