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.Â
Yorumlar
Yorum Yok
Yorumunuzu Ekleyin
Yorum eklemek için giris yapmalısınız.