Queue yapıları, ilk gelen ilk çıkar (first in-first out, FIFO) mantığı ile çalışan listelerdir. C# dilinde yer alan Queue<T> sınıfı bu mantık ile çalışan bir yapıdadır. Queue sınıfına Enqueue methodu ile yeni eleman ekleyebilir, Dequeue methodu ile de eklenmiş elemanları sırası ile okuyabiliriz.
Queue sınıfına öncelikler eklemeye karar verdik, peki nasıl yapacağız? .Net 6.0 ile tanıtılan PriorityQueue ile.
PriorityQueue Nedir?
Priority Queue, her öğenin diğer sıra öğeleriyle karşılaştırılabilecek bir “önceliğe” sahip olduğu bir kuyruktur.
Bir öğe kuyruğa alındığında, en yüksek önceliğe sahip öğe, ne zaman konulduğuna bakılmaksızın kuyruktan çıkarılır. Yani standart bir sırayı ilk giren ilk çıkar (FIFO) ve yığın tipinin son giren ilk çıkar (LIFO) olduğunu düşünürsek. Güzel bir kıyaslama olmaz.
PriorityQueue daha çok, liste içerisinde ne olursa olsun, en yüksek öncelikli elemanı listeden çıkartmaya başlar gibi düşünebiliriz.
.Net 6.0 preview sürümlerinde tanıtılan .Net 6.0 ile hayatımıza girecek olan PriorityQueue örnek kullanımı aşağıda görselde görülmektedir.
https://dotnetcoretutorials.com
Peki biz bu PriorityQueue listemizi kendimiz yazmaya çalışsak nasıl bir kodlama ortaya çıkartabiliriz gelin bakalım.
PriorityQueue sınıfımızı oluşturup, sınıfa her öncelik tipi için Queue barındıracak aşağıdaki değişken tanımlamasını ekleyelim;
PriorityQueue sınıfının constructor‘ında _queues değişkenine değer ataması yapalım.
Sırada bekleyen eleman var mı, varsa kaç eleman var sorularını cevaplayacak iki property daha ekleyelim;
İlgili öncelik tipine eleman ekleme işini yapacak Enqueue(Belirlenen öncelik değerine gönderilen elemanı ekleme işi. Örnegin öncelik durumu 1 olan şu elemanı kuyruğa ekle gibi.) method’unu yazalım;
Eğer ilgili öncelik tipi öncelikler listesinde yoksa, ilk olarak öncelik tipine ait yeni queue oluşturuluyor, sonra eleman öncelik tipinin listesine ekleniyor.