Mhendislik Mimarlk Fakltesi Bilgisayar Mhendislii Blm KUYRUK YAPILARI

Mühendislik Mimarlık Fakültesi Bilgisayar Mühendisliği Bölümü KUYRUK YAPILARI (Queue) Samet ULUTÜRK Mayıs 2020


1. GİRİŞ VERİ YAPILARI DOĞRUSAL OLMAYAN DİZİ AĞAÇ BAĞLI LİSTE GRAF YIĞIN KUYRUK • Veri yapıları Temel (Primitive) ve Basit(Simple) veri türleri (int, char, bool, array, string vb. ) haricinde 2 türden oluşmaktadır. • Doğrusal Veri Yapıları: Veri elemanlarını sıralı olarak düzenler. Veri öğeleri kendisinden önceki ve sonraki öğeyle ilişkilidir. • Doğrusal Olmayan Veri Yapıları: Bir veri öğesini, birçok veri öğesine bağlı olarak düzenler. Böylece belirli bir veri öğesinin, bir veya birden fazla öğeye ulaşma imkanı vardır. • Bu sunumda Doğrusal Veri Yapısı olan 3 «Kuyruk» konusu anlatılacaktır.

2. KUYRUK NEDİR ? ÇIKIŞ (Front veya Head) GİRİŞ (Rear veya Tail) • Kuyruk, eleman eklemelerin sondan (rear) ve eleman çıkarmaların baştan (front) yapıldığı, (First In First Outİlk Gelen İlk Çıkar–FIFO) olarak modellenen, doğrusal bir veri saklama yapısıdır. • Tanımdan anlaşılacağı üzere; Rear (tail): Listenin sonunu, Front (head): Listenin başını ifade eder. • Kuyruk veri yapısında listeye bir eleman ekleneceği zaman kuyruğun sonuna eklenir. Eleman çıkarılacağı zaman kuyruğun başından çıkarılır. Bu sebeple FIFO veya LILO (Last In Last Out – Son Giren Son Çıkar) listeleri olarak da bilinmektedirler. • Bilgisayar dünyasında sık kullanılan algoritmalardan bir tanesidir. • Kuyruk yapısı, Stack(Yığıt) yapısına oldukça benzemektedir. İki yapıda da eleman eklemeler sondan yapılmaktadır. Aralarındaki tek fark yığıtlarda eleman çıkarma işlemleri sondan yapılmasına rağmen; kuyruk yapısında baştan çıkarılmasıdır. 4

3. NEDEN İHTİYAÇ VARDIR • Bir kuyruk yapısı içerisindeki elemanlar birbirlerini sistemdeki konum sırasına göre takip ederler. Bu da veri iletiminin istenilen yere sırasıyla iletilmesini sağlar. • Client-Server mimarisinde istemcilerin bir sunucudan (web, database vb. ) bilgi talep etmesi durumunda karışıklığa mahal vermeden, sıraya koyarak, adil bir biçimde verinin sunulması için gereklidir. • Bir sistem kullanılırken, tüm taleplerin aynı anda kabul edilerek sistem performansını düşürmek yerine, sıraya koyarak, sistem kaynaklarını daha verimli ve hızlı kullanmak için gereklidir. • Olası kilitlenmelerin önüne geçerek, kullanıcıları ve sistem yöneticilerinin her zaman kurtarıcısı olarak görülmektedir. 5

4. KULLANIM ALANLARI • Kuyruk yapısı geliş sırasına göre hizmet verilmesi gereken senaryolarda sıklıkla kullanılır ve çok avantajlıdır. Bunlardan bazıları; • Günlük hayatta, • • • ATM sıraları, Otobüs durakları, Stok sistemleri, Hastaneler, Araç geçiş sistemleri, Fatura ödeme sırası vb. • • Yazıcı yazdırma sıraları, Ağ trafiğinde, İşletim sistemleri yapılarında, İstatistiksel hesaplamalarda, Çoklu işlem ortamlarında, G/Ç işlemlerinin okunmasında, Aynı veya farklı türden birden fazla verilerin A noktasından B noktasına iletiminde, Ara Bellek / Tampon Bellek oluşturulmasında, • Bilgisayar dünyasında, Dezavantaj: Kuyruk üzerinde bir verinin aranması vakit almaktadır. Kuyruğun en başından başlanıp elemanlarının teker incelenmesi gerekmektedir. Ayrıca kuyruğun aralarına eleman eklemek verinin indisinin kaydırılması sebebiyle karmaşıktır. Kuyruk yapısı kullanılmaktadır. 6

5. KUYRUK BİLEŞENLERİ • Ana Kuyruk İşlemleri olarak 2 temel işlem yapılabilir; • enqueue(object): Bir nesneyi kuyruğun en sonuna ekler. (Kaynaklarda push, add, insert, put olarak da geçmektedir. ) • dequeue(): Kuyruk başındaki nesneyi getirir ve kuyruktan çıkarır. (Kaynaklarda pop, remove, delete olarak da geçmektedir. • Yardımcı kuyruk işlemleri: • front(): kuyruk başındaki nesneyi kuyruktan çıkarmadan geri döndürür. • size(): kuyrukta saklanan nesne sayısını geri döner, dönüş tipi int. • empty(): Kuyrukta nesne olup olmadığını kontrol eder. Nesne varsa true yoksa false döndürür. • back(): Kuyruğa eklenen son elemanı dönderir. • İstisnai Durumlar (Exceptions): • Boş bir kuyruktan eleman çıkarma işlemi yapılmak istendiğinde veya ilk nesne geri döndürülmek istendiğinde (front) «Empty. Queue. Exception» hatası oluşur. Boş bir kuyruktan eleman döndürülemez. Bazı kaynaklarda ise bu hata adı «Invalid. Operation. Exception» ’dır. 7

6. ENQUEUE & DEQUEUE İŞLEMİ ENQUEUE İŞLEMİ Front Rear DEQUEUE İŞLEMİ Data 8

7. UYGULAMA 1 (C++) Ekran Çıktısı 9

8. UYGULAMA 2 (C# - Console App) Ekran Çıktısı 10

9. KUYRUK TASARIMI • Kuyruk tasarımı çeşitli şekillerde gerçekleştirilebilir. En basit ve sade olan tasarım şekli bir dizi ve bir indis değişkeni kullanılmasıdır. • Dizi gözlerinde kuyruğa eklenen veriler tutulurken, indis değişkeni kuyruğa eklenen son veriyi işaret eder. Ayrıca bu indisler rear ve front içinde kullanılır. • N elemanlı bir dizide, Dequeue işlemi her zaman için dizinin başı olan 0 indisinden yapılır. Enqueue işlemi ise dizinin son terimi olan (N-1) indisinden yapılır. • Kuyruk tasarımı temel olarak 3 şekilde yapılabilir, • Basit Kuyruk (Simple Queue) • Çevrimsel (Dairesel) Kuyruk (Circular Queue) • Öncelikli Kuyruk (Priority Queue) • Dizi • Bağlı Liste 11

9. 1. BASİT KUYRUK • Basit Kuyruk en basit ve sade şekliyle diziler kullanılarak uygulanabilir. • Örneğin kuyruk_1 adında bir dizimiz olsun. kuyruk_1[n] ifadesinde n, maksimum eleman sayısıdır. • Genel yapıdada bahsedildiği üzere uygulama da front ve rear isimli 2 tane değişken tanımlanır. • Front: Kuyruğun önündeki elemanı temsil eder ve değeri -1 ise kuyruk boştur. • Kuyruktan her eleman çıkarıldığında (Dequeue) front değeri 1 artar. • Rear: Kuyruğun sonundaki elemanı temsil eder. • Kuyruğa her eleman eklendiğinde (Enqueue) rear değeri 1 artar. 12

9. 1. BASİT KUYRUK DİZİ GERÇEKLEŞTİRİMİ N R Ö EK 1 n = 8 olan bir dizi olsun. 0 1 2 3 11 46 5 2 front = 0 4 5 6 7 rear = 3 Şimdi bu kuyruğa, Enqueue ve Dequeue işlemleri yaparak front ve rear değerlerini inceleyelim. 13

9. 1. BASİT KUYRUK DİZİ GERÇEKLEŞTİRİMİ 0 1 2 3 11 46 5 2 4 5 6 7 Başlangıç front = 0 rear = 3 0 1 2 3 4 11 46 5 2 20 Enqueue(20) front = 0 rear = 4 0 1 2 3 4 11 46 5 2 20 Dequeue() front = 1 rear = 4 14

9. 1. BASİT KUYRUK DİZİ GERÇEKLEŞTİRİMİ N R Ö EK 2 n = 5 olan bir dizi olsun. Adım 1. Kuyruş Boş front : -1 rear : -1 0 1 2 3 4 3 4 Adım 2. A, B, C elemanları sırayla kuyruğa eklensin. front : 0 rear : 2 0 1 2 A B C 1 2 Adım 3. Kuyruktan 2 tane eleman silelim. front : 2 rear : 2 0 C 15

9. 1. BASİT KUYRUK DİZİ GERÇEKLEŞTİRİMİ Adım 4. Kuyruğa D, E, F elemanlarını ekleyelim. front : 2 rear : 4 0 1 2 3 4 C D E • Görüldüğü üzere F’e yer kalmadı ve uygulama ortamında olsaydık kuyruk tasarımımızda overflow hatası meydana gelecekti. • 0 ve 1. indislerdeki gözler ise kullanılmaz hale geldi. • Buna bağlı olarak basit kuyruklar hep ileri yönde hareket etmektedir. • Ayrıca basit kuyruklar verimsiz alan kullanımına neden olmaktadır. • Dequeue işlemi sonucunda kuyrukta hiç eleman kalmazsa, kuyruk ilk başta oluşturulmuş gibi ilk durumuna getirilebilir. • Kaydırma (Shift) yapılarak önde kalan boş yerler kullanıma alınmak üzere arkaya taşınabilir veya tam tersi dolu olan gözler ön tarafa taşınabilir. Fakat bu işlem aşırı zaman alır ve maliyetlidir. • Kuyruğun boşta kalan öndeki alanlarını kullanmaya yönelik bir geliştirme yapılarak Dairesel Kuyruk tasarlanmıştır. 16

9. 1. UYGULAMA 3 (BASİT KUYRUK) Ekran Çıktısı 1 Ekran Çıktısı 2 Ekran Çıktısı 3 17

9. 2. ÇEVRİMSEL (DAİRESEL) KUYRUK 0 1 2 9 3 8 4 7 6 5 • 9. 1. Basit Kuyruk’ta karşılan ve kuyruğun başında kalan kullanılmayan alan problemini çözmek ve olası hataların önüne geçmek için çevrimsel kuyruk veri yapısı geliştirilmiştir. • Özetle bu kuyruk tipinde, kuyruğun başı ile sonu birleştirilmiştir. • Dolayısıyla önde kalan boş yerler arkadaymış gibi düşünülür ve otomatik olarak kullanıma açılır. 18

9. 2. ÇEVRİMSEL KUYRUK DİZİ GERÇEKLEŞTİRİMİ n = 5 olan bir dizi olsun. N R Ö EK Adım 1. Kuyruş Boş front : -1 rear : -1 0 1 2 3 4 3 4 Adım 2. A, B, C elemanları sırayla kuyruğa eklensin. front : 0 rear : 2 0 1 2 A B C 1 2 Adım 3. Kuyruktan 2 tane eleman silelim. front : 2 rear : 2 0 C 19

9. 2. ÇEVRİMSEL KUYRUK DİZİ GERÇEKLEŞTİRİMİ Adım 4. Kuyruğa D, E, F elemanlarını ekleyelim. front : 2 rear : 0 0 1 F 2 3 4 C D E 2 3 4 D E Adım 5. Kuyruğa 1 tane eleman silelim front : 3 rear : 0 0 1 F Adım 6. Kuyruğa G elemanını ekleyelim. front : 3 rear : 1 0 1 F G 2 20

9. 2. ÇEVRİMSEL KUYRUK DİZİ GERÇEKLEŞTİRİMİ • Bir önceki örneğin son adımında (6. Adım) oluşan kuyruğu dairesel yapıda göstermek istersek aşağıdaki gibi olacaktır. 0 4 F E Front 3 G D 1 Rear 2 21

9. 2. UYGULAMA 4 (ÇEVRİMSEL KUYRUK) Kaynak Kod Ekran Çıktısı Basit Kuyruk Uygulamasındaki Ekle() ve Sil() metotları güncellenmeli, verileri görmek için listele() metotu kullanılmıştır. 22

9. 3. ÖNCELİKLİ KUYRUK • Standart kuyruk veri yapısı önceliklendirme eksiği nedeniyle, bir çok durumda veya problemde kullanılmak için uygun olmayabilir. • Gerçek hayatta uygulanan kuyruk yapılarında öncelik durumu dikkate alınır. Önceliği yüksek olanlar her zaman önce işlem görürler. • Örneğin, hastane poliklinik muayene sıralarında, 65 yaş üstü, 7 yaş altı, Acil vakalar, Personel yakını gibi öncelik dereceleri vardır. Öncelik derecesi yüksek olan kişiler son sıradan girse bile en önce muayene olmaktadırlar. • Diğer bir örnek ise, dolmuş/otobüs oturma alanları verilebilir. 65 yaş üstü, 7 yaş altı, hamileler, engelliler gibi insanlar dolmuşta oturma önceliğindedirler. 23

9. 3. ÖNCELİKLİ KUYRUK • Öncelikli kuyruklar 2’ye ayrılmaktadır. • Artan Öncelikli Kuyruklar • Azalan Öncelikli Kuyruklar • Diğer veri yapılarında olduğu gibi kuyrukta bulunan elemanlar, string veya integer gibi basit veri türünde olabileceği gibi bir nesne de olabilir. • Öncelik kriteri kuyruk türüne göre farklılık göstermektedir. • Kuyruğa eklenen elemanın kendisi veya herhangi bir özelliği öncelik kriteri olabilir. • Öncelik kuyrukları Dizi veya Bağlı Liste olarak uygulanabilir. 24

9. 3. ÖNCELİKLİ KUYRUK DİZİ GERÇEKLEŞTİRİMİ n = 5 olan azalan tipte bir kuyruk ve dizi olsun. N R Ö EK Adım 1. Kuyruş Boş front : -1 rear : -1 0 1 2 3 4 Adım 2. 10 elemanı kuyruğa eklensin. front : 0 rear : 0 0 10 Adım 3. 30 elemanı kuyruğa eklensin. (30>10 olduğu için ilk sıraya yerleşti) front : 0 rear : 1 0 1 30 10 2 3 4 25

9. 3. ÖNCELİKLİ KUYRUK DİZİ GERÇEKLEŞTİRİMİ Adım 4. 1 elemanı kuyruğa eklensin. front : 0 rear : 2 0 1 2 30 10 1 3 4 Adım 5. 20 elemanı kuyruğa eklensin. (30<20<10 olduğu için araya eklenir) front : 0 rear : 3 0 1 2 3 30 20 10 1 4 Adım 6. 5 elemanı kuyruğa eklensin. (10<5<1 olduğu için araya eklenir) front : 0 rear : 4 0 1 2 3 30 20 10 5 4 1 26

9. 3. BAĞLI LİSTE İLE ÖNCELİKLİ KUYRUK • Bağlı liste oluşturma işleminde öncelikli olarak bir tane root düğümü oluşturup ardından gelen düğümleri sıra ile birbirlerini «next» pointer’ı ile işaret etmektedir. • Kuyruk işlemi de bu işleme çok benzemektedir. Sadece kuyruğa eklenen en son elemanı ayrı bir biçimde tutmamız gerekmektedir. • Kısacası root düğümünün yanında bir tane de «next» düğümü oluşturulur. Dolayısıyla Kuyruk birbirine bağlı liste haline dönüşmüş olacaktır. • Kuyruğa Eleman ekleme ve kuyruktan eleman çıkarma işlemlerinin mantığı ise Aynı şekilde eleman ekleme işlemi rear üzerinden, çıkarma işlemi ise front üzerinden yapılır. • Başlangıçta ilk eklenen eleman hem öndeki eleman hem de arkadaki eleman olur. Bu mantık üzerinden bağlı liste ile kuyruk yapısı oluşturulur. Rear A Next B Next C / Front node * root 27

9. 3. ÖNCELİKLİ KUYRUK (UYGULAMA 5) Ekran Çıktısı 28

9. 3. BAĞLI LİSTE İLE ÖNCELİKLİ KUYRUK (UYGULAMA 6) Ekran Çıktısı 29

10. KAYNAKÇALAR 1. Çevrimsel Kuyruk, Kod Örnekleri: Link: https: //www. geeksforgeeks. org/circular- queue-set-1 introduction-array-implementation/ Erişim: 10. 05. 2020 2. Veri Yapıları Genel Kavramlar, Yrd. Doç. Dr. Deniz KILINÇ, CBÜ. Link: https: //slideplayer. biz. tr/slide/15287113/ Erişim: 09. 05. 2020 3. Öncelikli Kuyruklar, Link: http: //bilgisayarkavramlari. sadievrenseker. com/2009/10/04/priorityqueue-oncelik-sirasi-ruchan-sirasi/ Erişim: 01. 05. 2020 4. Çevrimsel Kuyruk Yapıları & İmplementasyon Örnekleri, Link: https: //nerdbook. wordpress. com/2018/03/26/kuyruk-veri-yapisi-queue/ Erişim: 25. 04. 2020 5. Ömer ÇETİN, Veri Yapıları – Kuyruk - , http: //omercetin. com. tr/DERS/VY/Konu-8 -Kuyruk. pdf? i=1 Erişim: 13. 05. 2020 6. Hakan KUTUCU, Veri Yapıları: http: //web. karabuk. edu. tr/hakankutucu/BLM 227/VER%C 4%B 0%20 YAPILARI%20 v. 6. 3. pdf Erişim: 01. 04. 2020 7. Push ve pop işlemleri, Link: https: //www. geeksforgeeks. org/queuepush-and-queuepop-in-cpp-stl/ Erişim: 10. 05. 2020 8. C++ için Kuyruk sınıfı, üye metotlar, Link: http: //www. cplus. com/reference/queue/queue/ Erişim: 03. 05. 2020 9. Sadi Evren Şeker, Kuyruk Temel Kavramlar, Link: http: //bilgisayarkavramlari. sadievrenseker. com/ Erişim: 14. 05. 2020 10. Veri Yapıları –Kuyruk-, Pdf, Doç. Dr. Orhan ER, YOBÜ. 30
- Slides: 30