08 December 2016

LIFO & FIFO Yöntemleri ve Kolleksiyonlar

Daha önceki notlarımda kolleksiyonlar genel olarak yer almıştı. Burada iki kolleksiyon çeşidi olan Stack ve Queue kolleksiyonları üzerinde durup inceleme yapacağım.

Öncesinde konunun mantığını anlamak açısından LIFO & FIFO terimlerine bir göz atalım:

FIFO ingilizce açılımı First In First Out (İlk Giren İlk Çıkar) kelimelerinin baş harflarinden oluşur. Bunun en iyi örneği gerçek yaşamdaki kuyruklardır. Kuyruğa ilk giren kişi işlemini tamamlayıp ilk çıkacaktır. Son elemanın kuyruktan çıkabilmesi için önündeki tüm elemanların kuyruktan çıkmış olması gerekir. FIFO mantığı ile çalışan kolleksiyon Queue Kolleksiyonudur, aynı zamanda Kuyruk Kolleksiyonu da denilmektedir.

LIFO ingilizce açılımı Last In First Out (Son Giren İlk Çıkar) kelimelerinin baş harflarinden oluşur. LIFO’ya örnek olarak üst üste yığılmış tabakları gösterebiliriz. Bu yığına son eklenen tabak ilk alınıp oradan çıkacaktır. Bir eleman ekleneceğinde yığının en üstüne konulur. Bir eleman çıkarılacağı zaman yığının en üstündeki eleman çıkarılır. LIFO mantığı ile çalışan kolleksiyona da Stack Kolleksiyonu veya Yığın Kolleksiyonu denilmektedir.

Şimdi bu 2 kolleksiyonu incelemeye başlayabiliriz.

Queue Kolleksiyonu: Bu kolleksiyona eleman eklemek için Enqueue() metodunu kullanacağız. Eklenen her yeni eleman listenin (kuyruğun) sonuna eklenecektir.

Şimdi yeni bir kolleksiyon oluşturalım ve elemanları ekleyelim:

 Queue elemanlar = new Queue();
 elemanlar.Enqueue("Ahmet");
 elemanlar.Enqueue("Mehmet");
 elemanlar.Enqueue("Can");

Forma bir adet listbox ekleyip elemanları bu listbox’a aktaracak olursak ilk önce “Ahmet” elemanı eklenecektir. İlk giren ilk çıkar mantığı ile elemanlar listboxda sıralanır:

foreach (string eleman in elemanlar)
 {
 listBox1.Items.Add(eleman);
 }

Dequeue() metodu ile kuyruktaki ilk elemanı alabiliriz:

MessageBox.Show(elemanlar.Dequeue().ToString());

Dequeue() metodu  sıradaki elemanı geri döndürür ve sonra siler. Peek() metodu ise sadece okuma işlemi yapar silmez.

MessageBox.Show(elemanlar.Peek().ToString());

Clear() metodu kolleksiyonun içeriğini tamamen siler.

elemanlar.Clear();

Count() metodu ile eleman sayısını öğreniriz.

MessageBox.Show(elemanlar.Count.ToString());

ToArray() ile kolleksiyonumuzun içeriğini yeni diziye aktarabiliriz.

Array yenidizi = elemanlar.ToArray();
 foreach (string item in yenidizi)
 {
 listBox1.Items.Add(item);
 }

Clone() metodu da adından anlaşıldığı gibi kolleksiyonu klonlamaya yarıyor:

Queue yenibirdizi = new Queue();
 yenibirdizi = (Queue)elemanlar.Clone();
 foreach (string eleman in yenibirdizi)
 {
 listBox1.Items.Add(eleman);
 }

Contains() kolleksiyon içinde bir parametre arar:

if (elemanlar.Contains("Ahmet"))
 {
 MessageBox.Show("Böyle bir eleman mevcuttur");
 }
 else
 {
 MessageBox.Show("Böyle bir eleman yoktur");
 }

Queue Kolleksiyonunu detaylı incelemiş olduk. Son olarak ekleyebileceğim, bu koleksiyonları kullanmanın faydası eleman sayısı belirtilmediği taktirde koleksiyon boyutunun otomatik olarak ayarlanmasıdır. Stack koleksiyonu defaultta 10
elemanlı bir koleksiyon dizisi oluşturur, Queue koleksiyonunda ise dizi boyutu 32 elemanlıdır. Stack koleksiyonundan bahsetmeye başlayabiliriz.

Stack kolleksiyonu: Yukarıda bahsettiğim gibi nesneleri üstüste koyarak bir yığın oluşturduğumuzu düşünürsek bu kolleksiyonun yapısını daha iyi anlayabiliriz. Tabaklar örneğini vermiştim, genelde bir de şarjör örneği gösterilir o da aynıdır, son giren ilk çıkar mantığı ile. Stack kolleksiyonu metodlarına bakalım:

 Stack bloglar = new Stack();
 bloglar.Push("yazilimci blog");
 bloglar.Push("seo blog");
 bloglar.Push("webmaster blog");

Push() metodu ile elemanları ekledik. Bu elemanları listbox’a alacak olursak en üstte “webmaster blog” çıkacaktır. Son giren ilk çıkar mantığı ile:

foreach (string blog in bloglar)
 {
 listBox1.Items.Add(blog);
 }

Burada Pop() metodu sıranın sonundaki elemanı geri döndürür ve sonra siler. Yani kuyruktaki Dequeue() metoduna benzerdir. Diğer metodlar yani Clear(), Count(), Peek(), ToArray(), Clone(), Contains() tamamen Queue Kolleksiyonunda olduğu gibi çalışır.

Comments

  1. blogun ve anlattıkların gerçekten çok güzel bilgilerle dolu.zamanım olsaydı bende kendi blogumu yazmak isterdim.

    İyi çalışmalar.