Yığın (Stack) Nedir? Tanımı, Nasıl Çalışır ve Kullanım Alanları
Yığın (Stack), bilgisayar programcılığında son giren ilk çıkar (LIFO - Last In First Out) prensibine göre çalışan temel bir veri yapısıdır. Verileri sıralı bir şekilde depolayan yığın, yalnızca en üst elemandan veri ekleme (push) ve çıkarma (pop) işlemlerine izin verir. Bu basit yapı, karmaşık programlama problemlerini çözmede ve sistem mimarisinde kritik bir rol oynayan veri yapısıdır.
Yığın (Stack), bilgisayar programcılığında son giren ilk çıkar (LIFO - Last In First Out) prensibine göre çalışan temel bir veri yapısıdır. Verileri sıralı bir şekilde depolayan yığın, yalnızca en üst elemandan veri ekleme (push) ve çıkarma (pop) işlemlerine izin verir. Bu basit yapı, karmaşık programlama problemlerini çözmede ve sistem mimarisinde kritik bir rol oynayan veri yapısıdır.
Yığın Nasıl Çalışır?
Yığın, kitapları bir dizinin üzerine koymaya benzer şekilde çalışır. Yeni bir kitap (veri) eklemek istediğinizde onu en üste koyarsınız. Bir kitap çıkarmak istediğinizde de en üsttekini alırsınız. Alt taraftaki kitaplara erişmek için üstteki kitapları önce çıkarmanız gerekir.
Yığının çalışma mekanizması iki ana operasyondan oluşur:
- Push (Ekleme): Yeni bir elemanı yığının en üstüne ekler. Eğer yığın dolu ise "stack overflow" hatası oluşur.
- Pop (Çıkarma): Yığının en üst elemanını çıkarır ve bu elemanı döndürür. Eğer yığın boş ise "stack underflow" hatası oluşur.
- Peek (Göz Atma): En üst elemanı görmek için kullanılır ancak çıkarmaz.
- isEmpty (Boş Kontrol): Yığının boş olup olmadığını kontrol eder.
Yığının Avantajları
- Basit ve Hızlı: Push ve pop işlemleri O(1) zaman karmaşıklığında gerçekleşir, yani çok hızlıdır.
- Bellek Verimli: Doğrusal bellek kullanımı sayesinde bellek yönetimi etkili olur.
- İyileştirilmiş Veri Erişimi: En sık kullanılan veriye hızlı erişim sağlar.
- Geri Alma İşlemleri: Undo/Redo özelliklerinin doğal olarak uygulanmasını sağlar.
- İfade Değerlendirmesi: Matematiksel ifadeleri (özellikle ters Polish notasyonunu) değerlendirmede mükemmeldir.
Yığının Dezavantajları
- Sınırlı Erişim: Sadece en üst elemana hızlı erişim möglich; ortadaki elemanlara ulaşmak yavaştır.
- Sabit Boyut (Dizi Tabanlı): Dizi kullanılıyorsa, önceden boyut belirlenmesi gerekir.
- Sonuç Bağlılığı: İşleme sırası ciddi önem taşır; yanlış sırada veri işlemek yanlış sonuç verir.
- Bellek Boşa Gitmesi: Dinamik yığınlarda pointer saklama yüzünden ekstra bellek gerekebilir.
Yığın Nerede Kullanılır?
Yığın veri yapısı, programlama ve bilgisayar sistemlerinin birçok alanında kullanılan çok pratik bir araçtır:
- Fonksiyon Çağrıları: Bir program çalışırken işlemci yığını kullanarak fonksiyonların nasıl çağrıldığını ve hangi sırayla döndürüleceğini yönetir. Her fonksiyon çağrısı yığına eklenir, işlemi bitince pop edilir.
- Geri Alma (Undo) İşlemleri: Yazı editörleri, grafik tasarım programları ve belgeler her değişikliği yığına kaydeder. Ctrl+Z tuşuna bastığınızda son işlem pop edilir.
- Tarayıcıda Geri Butonu: Ziyaret edilen sayfalar bir yığında tutulur. Geri butonuna tıkladığınızda önceki sayfaya pop edilir.
- Derinlik İlk Arama (DFS): Grafiklerde ve ağaçlarda derinlik ilk araması yığın kullanarak gerçekleştirilir.
- Parantez Eşleştirme: Bir kodda açılı parantezlerin doğru eşleşip eşleşmediği kontrol etmek için yığın kullanılır.
- Ters Polish Notasyonu: Matematiksel ifadeleri değerlendirmek için yığın esas araçtır (örneğin: 3 4 + = 7).
- Bellek Yönetimi: Sistem seviyesinde, fonksiyon parametreleri ve yerel değişkenler yığında tutulur.
- Ağ Protokolleri: TCP/IP gibi ağ katmanlarının bazı işlemlerinde yığın kullanılır.
Yığın Türleri
Yığın, uygulandığı veri yapısına göre farklı şekillerde kategorize edilebilir:
| Yığın Türü | Açıklama | Avantajı |
|---|---|---|
| Dizi Tabanlı Yığın | Bellek alanında ardışık boşluk kullanarak yığın oluşturur. | Hızlı erişim, basit uygulama |
| Bağlantılı Liste Tabanlı Yığın | Her eleman bir pointer ile diğerine bağlı şekilde yer alır. | Dinamik boyut, bellek optimizasyonu |
| Sistem Yığını (Call Stack) | İşlemci tarafından donanım seviyesinde yönetilen yığın. | Çok hızlı, donanım desteği |
| Uygulama Yığını | Yazılım tarafından yönetilen ve kontrolü sağlanan yığın. | Esnek, özelleştirilebilir |
Pratik Örnek: Yığın ile Parantez Eşleştirme
Bir yazılımda denklem "{[(5+3)]}" yazılırsa, parantezlerin doğru eşleşip eşleşmediğini kontrol etmek için yığın kullanılır:
- "{" karşılaşıldığında yığına eklenir (push)
- "[" karşılaşıldığında yığına eklenir
- "(" karşılaşıldığında yığına eklenir
- "]" karşılaşıldığında yığının en üstü "[" ise çıkarılır (pop) — eşleşme var
- Tüm parantezler eşleştikten sonra yığın boş kalırsa, parantezler doğru eşleşmiştir.
"Yığın, LIFO prensibinin en etkili uygulamasıdır ve modern yazılım mimarisinin temel taşlarından biridir."
Yığın vs Kuyruk (Queue) Karşılaştırması
Yığın ile sıklıkla karıştırılan bir diğer veri yapısı kuyruk (queue) şudur:
| Özellik | Yığın (Stack) | Kuyruk (Queue) |
|---|---|---|
| Sıra | LIFO (Son Giren İlk Çıkar) | FIFO (İlk Giren İlk Çıkar) |
| Ekleme | En üsten (push) | Arkadan (enqueue) |
| Çıkarma | En üsten (pop) | Önden (dequeue) |
| Kullanım | Undo/Redo, fonksiyon çağrıları | Yazıcı kuyruğu, görev planlaması |
Stack Overflow ve Stack Underflow Hataları
Stack Overflow: Yığın dolu olduğu halde yeni bir eleman eklemeye çalışıldığında oluşur. Özellikle sonsuz özyineleme (infinite recursion) durumunda sistem yığını dolup bu hata ortaya çıkar. Bilgisayarı donmuş gibi görünür ve program çöker.
Stack Underflow: Boş bir yığından eleman çıkarmaya çalışıldığında oluşur. Kontrol mekanizmaları olmayan sistemlerde tanımsız davranışlara yol açabilir.