Stack ve Queue Koleksiyon Sýnýflarý

Bu 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ý incelemeþ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ý object tipinde tutmaktadýrlar. Bu koleksiyonlarýn özelliði giren-çýkan eleman prensibleri üzerine çaýlþmalarýdýr. Stack koleksiyon sýnýfi, LIFO adý verilen, Last In First Out( Son giren ilk çikar) prensibine gore çalýþýrken, Queue koleksiyon sýnýfý FIFO yani First In First Out(ilk giren ilk çýkar) prensibine gore çalýþýr. Konuyu daha iyi anlayabilmek için asaðýdaki þekilleri göz önüne alalým.

Sekil 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 koleksyion sýnýfýna gelince;

Sekil 2. Queue Koleksiyon Sýnýfýnýn Çalýþma Yapýsý

Görüldügü gibi Queue koleksiyon sinifinda elemanlar koleksiyona arkadan katilirlar ve ilk giren eleman kuyruktan ilk çikan 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 halini alir. 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ý siliniyor, Pop metodunu 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. Tabi diðer elemanlari kaybettikten sonra bunun çok büyük önem taþýyan bir eleman olmasýný da istemiþ olabiliriz.

Gelelim Queue koleksiyon sýnýfýnýn metodlarýna. Dequeue metodu ile koleksiyona ilk giren elemani 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ýfinda olduðu gibi, Peek metodunu kullanýrýz.

Bu koleksiyonlarin en güzel yanlarýndan birisi siz eleman sayýsýný belirtmediðiniz takdirde koleksiyonun boyutunu otomatik olarak kendilerinin ayarlamalarýdýr. Stack koleksiyon sýnýfý, varsayilan 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 katina çýkar. Ayni prensip queue koleksiyon sinifi içinde geçerli olmakla birlikte, queue koleksiyonu için varsayilan dizi boyutu 32 elemanli bir dizidir.

Simdi dilerseniz, basit bir console uygulamasi ile bu konuyu anlamaya çalisalim.

using System;
using System.Collections; /* Uygulamalarimizda koleksiyon siniflarini kullanabilmek için Collections isim uzayini kullanmamiz gerekir.*/

namespace StackSample1
{
     class Class1
     {

          static void Main(string[] args)
          {
               Stack stc=new Stack(4); /* 4 elemanli bir Stack koleksiyonu olusturduk.*/

               stc.Push("Burak"); /*Eleman eklemek için Push metodu kullaniliyor.*/
               stc.Push("Selim");
               stc.Push("SENYURT");
               stc.Push(27);
               stc.Push(true);

               Console.WriteLine("Çikan eleman {0}",stc.Pop().ToString());/* Pop metodu son giren(kalan) elemani verirken, ayni zamanda bu elemani koleksiyon dizisinden siler.*/
               Console.WriteLine("Çikan eleman {0}",stc.Pop().ToString());
               Console.WriteLine("Çikan eleman {0}",stc.Pop().ToString());
               Console.WriteLine("------------------");
               
               IEnumerator dizi=stc.GetEnumerator(); /* Koleksiyonin elemanlarini IEnumerator arayüzünden bir nesneye aktariyoruz.*/

               while(dizi.MoveNext()) /* dizi nesnesinde okunacak bir sonraki eleman var oldugu sürece isleyecek bir döngü.*/
               {
                    Console.WriteLine("Güncel eleman {0}",dizi.Current.ToString()); /* Current metodu ile dizi nesnesinde yer alan güncel elemani elde ediyoruzç. Bu döngüyü çalistirdigimizda sadece iki elemanin dizide oldugunu görürüz. Pop metodu sagolsun.*/
               }

               Console.WriteLine("------------------");
               Console.WriteLine("En üstteki eleman {0}",stc.Peek()); /* Peek metodu son giren elemani veya en üste kalan elemani verirken bu elemani koleksiyondan silmez.*/

               dizi=stc.GetEnumerator();

               while(dizi.MoveNext())
               {
                    Console.WriteLine("Güncel eleman {0}",dizi.Current.ToString()); /* Bu durumda yine iki eleman verildigini Peek metodu ile elde edilen elemanin koleksiyondan silinmedigini görürüz.*/
               }

          }
     }
}

3. Stack ile ilgili programýn ekran çýktýsý

Queue örnegimiz 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 kullaniliyor.*/
               qu.Enqueue("Selim");
               qu.Enqueue("SENYURT");
               qu.Enqueue(27);
               qu.Enqueue(true);

               Console.WriteLine("Çikan eleman {0}",qu.Dequeue().ToString());/* Dequeue metodu ilk giren(en alttaki) elemani verirken, ayni zamanda bu elemani koleksiyon dizisinden siler.*/
               Console.WriteLine("Çikan eleman {0}",qu.Dequeue().ToString());
               Console.WriteLine("Çikan eleman {0}",qu.Dequeue().ToString());
               Console.WriteLine("------------------");

               IEnumerator dizi=qu.GetEnumerator(); /* Koleksiyonin elemanlarini IEnumerator arayüzünden bir nesneye aktariyoruz.*/
               while(dizi.MoveNext()) /* dizi nesnesinde okunacak bir sonraki eleman var oldugu sürece isleyecek bir döngü.*/
               {
               Console.WriteLine("Güncel eleman {0}",dizi.Current.ToString()); /* Current metodu ile dizi nesnesinde yer alan güncel elemani elde ediyoruzç. Bu döngüyü çalistirdigimizda sadece iki elemanin dizide oldugunu görürüz. Dequeue metodu sagolsun.*/
               }

               Console.WriteLine("------------------");
               Console.WriteLine("En altta kalan eleman {0}",qu.Peek()); /* Peek metodu son giren elemani veya en üste kalan elemani verirken bu elemani koleksiyondan silmez.*/

               dizi=qu.GetEnumerator();

               while(dizi.MoveNext())
               {
                    Console.WriteLine("Güncel eleman {0}",dizi.Current.ToString()); /* Bu durumda yine iki eleman verildigini Peek metodu ile elde edilen elemanin koleksiyondan silinmedigini görürüz.*/
               }

          }
     }
}

Sekil 4. Queue ile ilgili programin ekran çýktýsý

Geldik bir makalemizin daha sonuna. Umuyorumki sizlere faydalý olabilecek bilgiler sunabilmiþimdir. Bir sonraki makalemizde görüsmek dileðiyle hepinize mutlu günler dilerim.