Bölüm 15: Yığın ve Kuyruk Uygulamaları

Labirent, ifadeler, çoklu yapılar ve değerlendirme
LabirentÇoklu yığınPostfixInfix dönüşümüKuyruk tamponuİzleme
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

Labirent ve Çoklu yığın

Bu bölümün hedefi

Konum ve yön adaylarını yığında saklayarak geri izlemek.

Başlangıç sorusu

Postfix neden paranteze ihtiyaç duymaz?

Giriş

Öğrenme Çıktıları

Labirenti modellemek

Konum ve yön adaylarını yığında saklayarak geri izlemek.

İfade dönüştürmek

İşleç önceliğini yığınla yönetmek.

Postfix hesaplamak

İşlenenleri yığına koyup işleçte iki değer almak.

Belleği paylaşmak

Bir dizide birden çok yığın/kuyruğu sınırlarla yönetmek.

Temel Kavramlar

Yardımcı yapı algoritmanın hafızasıdır

Labirentte dönüş noktaları, ifade çözümlemede bekleyen işleçler ve hizmette bekleyen işler ayrı türden geçmiş bilgidir.

Labirent

Denenmemiş yönleri olan konumlar yığında bekler.

Postfix

İşlenenler yığına; işleç gelince sonuç geri yığına.

Infix

İşleç önceliği ve parantez yığınla tutulur.

Çoklu yapı

Boş alanın yapılar arasında paylaşımı taşmayı geciktirir.

Temel Kavramlar

Kavram Haritası

1Labirent
2Çoklu yığın
3Postfix
4Infix dönüşümü
5Kuyruk tamponu
6İzleme
Labirentte dönüş noktaları, ifade çözümlemede bekleyen işleçler ve hizmette bekleyen işler ayrı türden geçmiş bilgidir.

Gösterim

Postfix ifade: 23*54*+9-

2 3 *6
→
5 4 *20
→
+26
→
9 -17

C ile Gerçekleştirim

Labirent durumu

typedef struct {
    int satir, sutun;
    int sonraki_yon;
} Durum;

typedef struct { Durum *veri; int ust, kapasite; } DurumYigini;
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 ikili işleçte sağ ve sol işleneni ters almak riskiyle birlikte test et.

Temel İşlemler

Postfix hesaplamanın çekirdeği

if (isdigit((unsigned char)token)) push(&y, token - '0');
else {
    int sag = pop(&y);
    int sol = pop(&y);
    push(&y, uygula(token, sol, sag));
}
Kod örnekleri C99/C11 uyumlu olacak biçimde küçük ve tek sorumluluklu tutulmuştur.

Temel İşlemler

Kodu Okurken

Ön koşul

Postfix neden paranteze ihtiyaç duymaz?

Değişmez

Her adımda labirent kuralı korunuyor mu?

Son koşul

İşleç önceliğini yığınla yönetmek.

Hata yolu

Parantezi postfix çıktısına yazmak

Adım Adım

Labirentte geri izleme

İlerle

Geçerli ve görülmemiş komşuya git.

Seçenekleri sakla

Dönüş noktası ve sıradaki yön yığıtta dursun.

Çıkmaz

Geçerli komşu kalmadıysa yığından önceki durumu al.

Bitir

Çıkış bulunduğunda yığındaki durumlar yolu oluşturur.

Sınıf Notu

Dersten Sesler

“Bana algoritmanızı söyleyin, size veri yapınızı söyleyeyim.”
“Analizini bile beceremediğin algoritmaya burun kıvırma! Önce problemi araş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
Postfix değerlendirmeO(n)O(n)
Infix→postfixO(n)O(n)
Labirent DFSO(rc)O(rc)
Dairesel kuyruk işlemiO(1)O(1)
İki yığın bir diziO(1)O(n) toplam

n: öğe sayısı · h: yükseklik · V: düğüm sayısı · E: kenar sayısı

Tasarım Kararı

Hangi Durumda Hangisi?

Yığın

Son kararı geri almak veya iç içe yapı çözmek için.

Kuyruk

Geliş sırası ve katman sırası için.

İki yığın

İki uçtan büyüyerek ortak boşluğu verimli paylaşmak için.

Look-up table

Az sayıdaki durum için uzun koşul zincirini sadeleştirmek için.

Dikkat

Sık Yapılan Hatalar

1İkili işleçte sağ ve sol işleneni ters almak
2Parantezi postfix çıktısına yazmak
3Labirent hücresini ziyaret edildi diye işaretlememek
4Çoklu yapılarda sınır çakışmasını geç fark etmek

Alıştırmalar

Kendini Sına

  1. Postfix neden paranteze ihtiyaç duymaz?
  2. İşleçte yığından hangi sırayla değer alınır?
  3. Labirentte yığında ne tutulur?
  4. İki yığın tek diziyi nasıl paylaşır?
  5. BFS tabanlı labirent çözümü ne ek avantaj verir?
Cevapları göster
  1. İşlem sırası dizilişte açıkça kodlanmıştır.
  2. Önce sağ, sonra sol işlenen.
  3. Konum ve denenmemiş sonraki yön.
  4. Biri soldan, diğeri sağdan merkeze büyür.
  5. Ağırlıksız en kısa yolu bulur.

Uygulama

Mini Laboratuvar

1 · Çiz

Postfix neden paranteze ihtiyaç duymaz?

2 · Kodla

Labirentte yığında ne tutulur?

3 · Ölç

BFS tabanlı labirent çözümü ne ek avantaj verir?

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

Özet

Bölüm Özeti

Geçmişi sakla

Yığın geri dönüş noktalarını taşır.

Önceliği dışsallaştır

İfade çözümleme yığınla sistemleşir.

Alanı paylaş

Çoklu yapılar sabit belleği daha iyi kullanabilir.

Özet

Kaynaklar ve Devam

Son

Bölüm 15: Yığın ve Kuyruk Uygulamaları
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