19 Oca 2016

C#'da Queue, Stack ve Set Kütüphaneleri

LINKEDLIST
LinkedList, birbirine bağlı birçok objeden oluşan, içerisinde ileri geri gezebildiğimiz, araya obje ekleyebildiğimiz bir kütüphanedir. Her elemanın birbirine sıra olarak bağlı olması mantığından türemiştir.
Eğer sıra ile ileri ve geri gezmek istediğimiz bir listeye ihtiyaç varsa, LinkedList kullanmamız gerekir. Bunun dışında performans düşüreceğinden standart kullanımda tavsiye edilmez.
LinkedList<DateTime> list = new LinkedList<DateTime>();

list.AddFirst(DateTime.Now); //başa ekleme
list.AddLast(new DateTime(2010, 4, 2)); //sona ekleme
LinkedListNode<DateTime> lastAddition = list.AddLast(DateTime.Now.AddMonths(-1)); 
//LinkedListNode, LinkedList sınıfının elemanlarının tipini temsil eder Bu tip bağımlı listelerin her elemanına "node" denir.
list.AddAfter(lastAddition, DateTime.Now.AddYears(-1));

LinkedListNode<DateTime> current; //node tipinde bir değişken tanımladık.
current = list.First; //birinci elemanı bu değişkene atadık
Console.WriteLine("Birinci: {0}", current.Value); //value ile değeri yazdırabiliriz
current = current.Next; //sonraki elemanı gezebiliriz
current = list.Last; //sonuncu elemanı da bu değişkene atayabiliriz
Console.WriteLine("Sonuncu: {0}", current.Value);
current = current.Previous; //önceki elemanı gezebiliriz

current = list.Find(new DateTime(2003, 4, 4)); //Find ile bir elemanı bulabiliyoruz

list.RemoveFirst(); //baştaki elemanı silme 
list.RemoveLast(); //sondaki elemanı silme

Console.WriteLine("Birinci ve sonuncuyu çıkarınca {0} adet kaldı", list.Count);

QUEUE VE STACK (SIRA VE YIĞIN)
  • Queue ve Stack, birbirine çok benzeyen 2 sınıftır. Bu iki sınıf da aslında birer listedir. Sadece özelleştirilmiş metodları vardır.
  • Queue, Last in Last out – LILO (Son Eklenen Son Çıkar) mantığı ile çalışır. Sıraya eklediğiniz bütün elemanlar, sırasıyla çağrıldığında, sıradan alınır ve çıkartılır. Bilet kuyruğu buna bir örnektir. Sıraya en son giren en son bilet atacaktır.
  • Stack ise, LIFO ( son eklenen ilk çıkar) mantığı ile çalışır. Yemekhanede üst üste duran tepsilerden en son eklediğimizi kullanmak için ilk alırız. Stack sınıfı bu tip durumlarda kullanılır.
QUEUE ÖRNEĞİ:
Queue<DateTime> queue = new Queue<DateTime>();
queue.Enqueue(DateTime.Now); //enqueue metodu ile sıraya tarihleri ekliyoruz
queue.Enqueue(new DateTime(2010, 4, 2));
queue.Enqueue(DateTime.Now.AddMonths(-1));
queue.Enqueue(DateTime.Now.AddYears(-10));
Console.WriteLine("Sıranın en başına göz atalım: {0}", queue.Peek()); 
//peek metodu sıranın başına göz atar, fakat sıradan çıkarmaz
while(queue.Count> 0)
{
     Console.WriteLine("Sıradaki: {0}", queue.Dequeue()); //dequeue ile hem sıradakini işlemek için alıyoruz, hem sıradan çıkartıyoruz
}
Console.WriteLine("Hepsini dequeue ettik {0} eleman kaldı", queue.Count);
STACK ÖRNEĞİ:
Stack<DateTime> stack = new Stack<DateTime>();
stack.Push(DateTime.Now); //push ile yığının en üstünü tarihleri koyduk
stack.Push(new DateTime(2010, 4, 2));
stack.Push(DateTime.Now.AddMonths(-1));
stack.Push(DateTime.Now.AddYears(-10));
Console.WriteLine("Sıranın en başına göz atalım: {0}", stack.Peek()); //peek metodu en üstteki elemana göz atar, yığından çıkarmaz
while (stack.Count > 0)
{
     Console.WriteLine("Sıradaki: {0}", stack.Pop()); //pop metodu ile üstten başlayarak tarihleri aldık, hem son eklenen elemanı dönüyor hem de yığından çıkartıyor
}
Console.WriteLine("Hepsini Pop Edince sırada {0} eleman kaldı", stack.Count);

BITARRAY
Bool tipindeki dizilere alternatif bir yapıdır. Hafıza olarak daha efektif ve performans olarak daha hızlıdır. Ayrıca BitArray’ın hazır logic(mantık) metodlarını da bu sınıf metodları dahilinde kullanabiliyoruz.
private static BitArray bitArray1 = new BitArray(4);
private static BitArray bitArray2 = new BitArray(4);

public static void Run()
{
Console.WriteLine("İki BitArray'imiz olsun");// bit array'lerin her and or işleminden sonra değerleri değiştiği için, yeniden ilk değerlerine resetliyoruz
ResetBitArrays();
Console.WriteLine("bitArray1 = {0}", GetBits(bitArray1));
Console.WriteLine("bitArray2 = {0}", GetBits(bitArray2));
ResetBitArrays();
Console.WriteLine("\nbitArray1 AND bitArray2 = {0}", GetBits(bitArray1.And(bitArray2)));
ResetBitArrays();
Console.WriteLine("bitArray1 OR  bitArray2 = {0}", GetBits(bitArray1.Or(bitArray2)));
ResetBitArrays();
Console.WriteLine("bitArray1 XOR bitArray2 = {0}", GetBits(bitArray1.Xor(bitArray2)));
ResetBitArrays();
Console.WriteLine("\nNOT bitArray1 = {0}", GetBits(bitArray1.Not()));
}
private static void ResetBitArrays()
{
bitArray1.SetAll(false);
bitArray1[0] = true;
bitArray1[1] = true;

bitArray2.SetAll(false);
bitArray2[0] = true;
bitArray2[2] = true;
}
private static string GetBits(BitArray array)
{
string result = default(string);
foreach (bool item in array)
{
result += Convert.ToInt32(item).ToString();
}
return result;


HASHSET VE SORTEDSET
  • İkisi de list mantığı ile aynı çalışır. İkiside Add metodu ile ekleme kabul eder fakat List ve Dictionary’den farklı olarak aynı değer eklenmeye çalışıldığında bunu eklemez ve hata da vermez.
  • HashSet, arama işlemlerini kolaylaştırmak için eklediği elemanları ayrıca Hash işlemine tabi tutar.
  • SortedSet ise eklenen elemanları içinde sıralı tutar ve her yeni eklemede tekrar sıralar. Bu çok pahalı bir işlemdir. Ancak az ekleme yapıp sürekli sıralı ulaşmak istediğiniz veriler için kullanılır.
.NET Framework kütüphaneleri içinde bize sunulan her farklı sınıf, farklı bir problemi çözmek için oluşturulmuştur. 

Hiç yorum yok:

Yorum Gönder