Bölüm 15: Yığın ve Kuyruk Uygulamaları
Hazırlık
Başlamadan Önce
Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.
Labirent ve Çoklu yığın
Konum ve yön adaylarını yığında saklayarak geri izlemek.
Postfix neden paranteze ihtiyaç duymaz?
Giriş
Öğrenme Çıktıları
Konum ve yön adaylarını yığında saklayarak geri izlemek.
İşleç önceliğini yığınla yönetmek.
İşlenenleri yığına koyup işleçte iki değer almak.
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.
Denenmemiş yönleri olan konumlar yığında bekler.
İşlenenler yığına; işleç gelince sonuç geri yığına.
İşleç önceliği ve parantez yığınla tutulur.
Boş alanın yapılar arasında paylaşımı taşmayı geciktirir.
Temel Kavramlar
Kavram Haritası
Gösterim
Postfix ifade: 23*54*+9-
C ile Gerçekleştirim
Labirent durumu
typedef struct {
int satir, sutun;
int sonraki_yon;
} Durum;
typedef struct { Durum *veri; int ust, kapasite; } DurumYigini;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 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));
}Temel İşlemler
Kodu Okurken
Postfix neden paranteze ihtiyaç duymaz?
Her adımda labirent kuralı korunuyor mu?
İşleç önceliğini yığınla yönetmek.
Parantezi postfix çıktısına yazmak
Adım Adım
Labirentte geri izleme
Geçerli ve görülmemiş komşuya git.
Dönüş noktası ve sıradaki yön yığıtta dursun.
Geçerli komşu kalmadıysa yığından önceki durumu al.
Çı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
| İşlem | Zaman | Ek bellek |
|---|---|---|
| Postfix değerlendirme | O(n) | O(n) |
| Infix→postfix | O(n) | O(n) |
| Labirent DFS | O(rc) | O(rc) |
| Dairesel kuyruk işlemi | O(1) | O(1) |
| İki yığın bir dizi | O(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?
Son kararı geri almak veya iç içe yapı çözmek için.
Geliş sırası ve katman sırası için.
İki uçtan büyüyerek ortak boşluğu verimli paylaşmak için.
Az sayıdaki durum için uzun koşul zincirini sadeleştirmek için.
Dikkat
Sık Yapılan Hatalar
Alıştırmalar
Kendini Sına
- Postfix neden paranteze ihtiyaç duymaz?
- İşleçte yığından hangi sırayla değer alınır?
- Labirentte yığında ne tutulur?
- İki yığın tek diziyi nasıl paylaşır?
- BFS tabanlı labirent çözümü ne ek avantaj verir?
Cevapları göster
- İşlem sırası dizilişte açıkça kodlanmıştır.
- Önce sağ, sonra sol işlenen.
- Konum ve denenmemiş sonraki yön.
- Biri soldan, diğeri sağdan merkeze büyür.
- Ağırlıksız en kısa yolu bulur.
Uygulama
Mini Laboratuvar
Postfix neden paranteze ihtiyaç duymaz?
Labirentte yığında ne tutulur?
BFS tabanlı labirent çözümü ne ek avantaj verir?
Özet
Bölüm Özeti
Yığın geri dönüş noktalarını taşır.
İfade çözümleme yığınla sistemleşir.
Çoklu yapılar sabit belleği daha iyi kullanabilir.
Özet
Kaynaklar ve Devam
- VYA1 yığıtlar ve kuyruklar bölümü uygulamaları
- Horowitz, Sahni ve Anderson-Freed, Fundamentals of Data Structures in C.
- Kernighan ve Ritchie, The C Programming Language.
Son
← → veya boşluk ile gezinin · F: tam ekran · Home/End: ilk/son slayt