Stack, LIFO (Last-In, First-Out - Son Giren İlk Çıkar) prensibine göre çalışan doğrusal bir veri yapısıdır. Günlük hayattaki üst üste dizilmiş tabaklara benzetilebilir. En son eklenen tabak en üstte yer alır ve ilk olarak o alınır. Aynı şekilde, bir stack'e en son eklenen eleman (push işlemi) ilk olarak çıkarılır (pop işlemi). Stack, LIFO prensibine göre çalışan temel bir doğrusal veri yapısıdır. Ekleme (push) ve çıkarma (pop) işlemleri sadece en üstten yapılır. Fonksiyon çağrıları, geri alma/ileri alma işlemleri, tarayıcı geçmişi, ifade değerlendirme gibi birçok alanda önemli bir rol oynar. Dizi veya bağlı liste kullanılarak uygulanabilir ve basit, hızlı bir yapıya sahiptir ancak sınırlı erişim ve potansiyel boyut sorunları dezavantajları olabilir.
Stack'in Çalışma Prensibi (LIFO):
LIFO prensibi, stack'e en son eklenen elemanın, çıkarılacak ilk eleman olacağını ifade eder. Bu özellik, belirli algoritmaların ve işlemlerin doğal bir şekilde modellenmesini sağlar.
Stack'in Uygulanması:
Stack, genellikle iki temel yöntemle uygulanabilir:
- Diziler (Arrays) ile Uygulama:
- Sabit veya dinamik boyutlu diziler kullanılabilir.
- Stack'in en üstünü takip etmek için bir "top" (veya "pointer") değişkeni kullanılır.
- Push işlemi: "top" değeri bir artırılır ve yeni eleman dizinin bu yeni indeksine yerleştirilir.
- Pop işlemi: Eğer stack boş değilse, dizinin "top" indeksindeki eleman döndürülür ve "top" değeri bir azaltılır.
- Avantajları: Basit ve hızlı erişim.
- Dezavantajları: Sabit boyutlu dizilerde taşma (overflow) riski, dinamik boyutlu dizilerde ise yeniden boyutlandırma maliyeti olabilir.
- Sabit veya dinamik boyutlu diziler kullanılabilir.
- Bağlı Listeler (Linked Lists) ile Uygulama:
- Her elemanın (node) hem veriyi hem de bir sonraki elemanın adresini tuttuğu bir yapı kullanılır.
- Stack'in en üstü, bağlı listenin başı (head) olarak kabul edilir.
- Push işlemi: Yeni bir node oluşturulur, verisi atanır ve bu node, mevcut başa bağlanır. Yeni node, listenin yeni başı olur.
- Pop işlemi: Eğer stack boş değilse, baştaki node'un verisi döndürülür ve baş, bir sonraki node'a kaydırılır.
- Avantajları: Dinamik boyut, taşma riski daha az (bellek sınırları dahilinde).
- Dezavantajları: Diziye göre biraz daha fazla bellek kullanımı (pointer için ek alan) ve elemanlara doğrudan erişim olmaması.
- Her elemanın (node) hem veriyi hem de bir sonraki elemanın adresini tuttuğu bir yapı kullanılır.