Stack ve Queue Koleksiyon Sınıfı
İçindekiler
Bugünkü makalemizde Stack ve Queue koleksiyon sınıflarını incelemeye çalışacağız. Bir önceki makalemizde bildiğiniz gibi, HashTable koleksiyon sınıfını incelemiştik. Stack ve Queue koleksiyonları da, System.Collections isim alanında yer alan ve ortak koleksiyon özelliklerine sahip sınıflardır. Stack ve Queue koleksiyonları, her koleksiyon sınıfında olduğu gibi, elemanlarını nesne (object) tipinde tutmaktadırlar. Bu koleksiyonların özelliği giren-çıkan eleman prensipleri üzerine çalışmalarıdır. Stack koleksiyon sınıfı, LIFO adı verilen Last In First Out (Son giren ilk çıkar) prensibine göre çalışırken, Queue koleksiyon sınıfı ise FIFO yani First In First Out (İlk giren ilk çıkar) prensibine göre çalışır. Konuyu daha iyi anlayabilmek için aşağıdaki şekilleri göz önüne alalım.

Şekil 1. Stack Koleksiyon Sınıfının Çalışma Yapısı
Görüldüğü gibi, Stack koleksiyonunda yer alan elemanlardan son girene ulaşmak oldukça kolaydır. Oysaki ilk girdiğimiz elemana ulaşmak için, bu elemanın üstünde yer alan diğer tüm elemanları silmemiz gerekmektedir. Queue koleksiyon sınıfına gelince;

Şekil 2. Queue Koleksiyon Sınıfının Çalışma Yapısı
Görüldüğü gibi Queue koleksiyon sınıfında elemanlar koleksiyona arkadan katılırlar ve ilk giren eleman kuyruktan ilk çıkan eleman olur. Stack ve Queue farklı yapılarda tasarlandıkları için elemanlarına farklı metodlar ile ulaşılmaktadır. Stack koleksiyon sınıfında, en son giren elemanı elde etmek için Pop metodu kullanılır. Koleksiyona bir eleman eklerken Push metodu kullanılır. Elbette eklenen eleman en son elemandır ve Pop metodu çağırıldığında elde edilecek olan ilk eleman hâlini alır. Ancak Pop metodu son giren elemanı verirken bu elemanı koleksiyondan siler. İşte bunun önüne geçen metod Peek metodudur. Şimdi diyebilirsiniz ki madem son giren elemanı siliyor Pop metodu, o zaman niye kullanıyoruz? Hatırlarsanız, Stack koleksiyonunda, ilk giren elemanı elde etmek için bu elemanın üstünde yer alan tüm elemanları silmemiz gerektiğini söylemiştik. İşte bir döngü yapısında Pop metodu kullanıldığında, ilk giren elemana kadar inebiliriz. Tabii diğer elemanları kaybettikten sonra bunun çok büyük önem taşıyan bir eleman olmasını isteyebiliriz.
Gelelim Queue koleksiyon sınıfının metodlarına. Dequeue metodu ile koleksiyona ilk giren elemanı elde ederiz. Ve bunu yaptığımız anda eleman silinir. Nitekim Dequeue metodu Pop metodu gibi çalışır. Koleksiyona eleman eklemek için ise, Enqueue metodu kullanılır. İlk giren elemanı elde etmek ve silinmemesini sağlamak istiyorsak yine Stack koleksiyon sınıfında olduğu gibi, Peek metodunu kullanırız. Bu koleksiyonların en güzel yanlarından birisi, size eleman sayısını belirtmediğiniz takdirde koleksiyonun boyutunu otomatik olarak kendilerinin ayarlamalarıdır. Stack koleksiyon sınıfı, varsayılan olarak 10 elemanlı bir koleksiyon dizisi oluşturur (eğer biz eleman sayısını yapıcı metodumuzda belirtmez isek). Eğer eleman sayısı 10’u geçerse, koleksiyon dizisinin boyutu otomatik olarak iki katına çıkar. Aynı prensip Queue koleksiyon sınıfı içinde geçerli olmakla birlikte, Queue koleksiyonu için varsayılan dizi boyutu 32 elemanlı bir dizidir. Şimdi dilerseniz, basit bir console uygulaması ile bu konuyu anlamaya çalışalım.
using System;
using System.Collections; /* Uygulamalarımızda koleksiyon sınıflarını kullanabilmek için Collections isim uzayını kullanmamız gerekir.*/
namespace StackSample1
{
class Class1
{
static void Main(string[] args)
{
Stack stc =new Stack(4); /* 4 elemanlı bir Stack koleksiyonu oluşturduk.*/
stc.Push("Burak");
/*Eleman eklemek için Push metodu kullanılıyor.*/
stc.Push("Selim");
stc.Push("ŞENYURT");
stc.Push(27);
stc.Push(true);
Console.WriteLine("Çıkan eleman {0}", stc.Pop().ToString());
/* Pop metodu son giren(kalan) elemanı verirken, aynı zamanda bu elemanı koleksiyon dizisinden siler.*/
Console.WriteLine("Çıkan eleman {0}", stc.Pop().ToString());
Console.WriteLine("Çıkan eleman {0}", stc.Pop().ToString());
Console.WriteLine("------------------");
IEnumerator dizi = stc.GetEnumerator();
/* Koleksiyonın elemanlarını IEnumerator arayüzünden bir nesneye aktarıyoruz.*/
while (dizi.MoveNext()) /* dizi nesnesinde okunacak bir sonraki eleman var olduğu sürece işleyecek bir döngü.*/
{
Console.WriteLine("Güncel eleman {0}", dizi.Current.ToString());
/* Current metodu ile dizi nesnesinde yer alan güncel elemanı elde ediyoruzç. Bu döngüyü çalıştırdığımızda sadece iki elemanın dizide olduğunu görürüz. Pop metodu sağolsun.*/
}
Console.WriteLine("------------------");
Console.WriteLine("En üstteki eleman {0}", stc.Peek());
/* Peek metodu son giren elemanı veya en üste kalan elemanı verirken bu elemanı koleksiyondan silmez.*/
dizi = stc.GetEnumerator();
while (dizi.MoveNext())
{
Console.WriteLine("Güncel eleman {0}", dizi.Current.ToString());
/* Bu durumda yine iki eleman verildiğini Peek metodu ile elde edilen elemanın koleksiyondan silinmediğini görürüz.*/
}
}
}
}

Şekil 3. Stack ile ilgili programın çalışmasının sonucu.
Queue örneğimiz ise aynı kodlardan oluşuyor sadece metod isimleri farklı.
using System;
using System.Collections;
namespace QueueSample1
{
class Class1
{
static void Main(string[] args)
{
Queue qu =new Queue(4);
qu.Enqueue("Burak");
/*Eleman eklemek için Enqueue metodu kullanılıyor.*/
qu.Enqueue("Selim");
qu.Enqueue("ŞENYURT");
qu.Enqueue(27);
qu.Enqueue(true);
Console.WriteLine("Çıkan eleman {0}", qu.Dequeue().ToString());
/* Dequeue metodu ilk giren(en alttaki) elemanı verirken, aynı zamanda bu elemanı koleksiyon dizisinden siler.*/
Console.WriteLine("Çıkan eleman {0}", qu.Dequeue().ToString());
Console.WriteLine("Çıkan eleman {0}", qu.Dequeue().ToString());
Console.WriteLine("------------------");
IEnumerator dizi = qu.GetEnumerator();
/* Koleksiyonın elemanlarını IEnumerator arayüzünden bir nesneye aktarıyoruz.*/
while (dizi.MoveNext()) /* dizi nesnesinde okunacak bir sonraki eleman var olduğu sürece işleyecek bir döngü.*/
{
Console.WriteLine("Güncel eleman {0}", dizi.Current.ToString());
/* Current metodu ile dizi nesnesinde yer alan güncel elemanı elde ediyoruzç. Bu döngüyü çalıştırdığımızda sadece iki elemanın dizide olduğunu görürüz. Dequeue metodu sağolsun.*/
}
Console.WriteLine("------------------");
Console.WriteLine("En altta kalan eleman {0}", qu.Peek());
/* Peek metodu son giren elemanı veya en üste kalan elemanı verirken bu elemanı koleksiyondan silmez.*/
dizi = qu.GetEnumerator();
while (dizi.MoveNext())
{
Console.WriteLine("Güncel eleman {0}", dizi.Current.ToString());
/* Bu durumda yine iki eleman verildiğini Peek metodu ile elde edilen elemanın koleksiyondan silinmediğini görürüz.*/
}
}
}
}

Şekil 4. Queue ile ilgili programın çalışmasının sonucu.
Geldik bir makalemizin daha sonuna. Umuyorumki sizlere faydalı olabilecek bilgiler sunabilmişimdir. Bir sonraki makalemizde görüşmek dileğiyle hepinize mutlu günler dilerim.