C'de Dairesel Sıra: Nasıl Uygulanır?

Yayınlanan: 2020-10-23

Veriler, son elemanın ilk elemana bağlı olduğu dairesel bir düzende dairesel bir kuyrukta düzenlenir. Görevlerin FIFO'da (İlk Giren İlk Çıkar) yürütüldüğü doğrusal kuyruğun aksine, görev yürütmenin dairesel kuyruk sırası değişebilir. Ekleme ve Silme işlemleri herhangi bir pozisyonda yapılabilir.

Dairesel kuyruk, doğrusal kuyruktan daha verimlidir. Dairesel bir kuyruğun grafik gösteriminde, ön ve arka konumların birbirine bağlı olduğunu gözlemleyebilirsiniz, bu da onu, işlemlerin her zaman bir FIFO temelinde yürütüldüğü bir daire haline getirir. Her yeni eleman arka uca eklenir ve ön uçtan silinir. Dairesel bir kuyruk daha iyi bir kullanıma sahiptir ve O(1) zaman karmaşıklığına sahiptir.

Kaynak

İçindekiler

Dairesel Kuyruk Uygulamaları

  • CPU Zamanlama: Dairesel sıralar, doğrusal sıralarda bulunan boş bellek alanlarından yararlanır.
  • Trafik Sistemi: Trafik sisteminde dairesel kuyruklar yardımıyla trafik ışıkları belirlenen zaman aralığında çalıştırılır.
  • Bellek Yönetimi: İşletim sistemleri, genellikle yürütmeye hazırlanan veya belirli bir olayın gerçekleşmesini bekleyen bir dizi işlemi sürdürür.

Öğrenin: Kabarcık Sıralama için C Programı: C'de Kabarcık Sıralama

Açıklamalı Örnek Kod

Satır 1: // (1) Önişlemciler

Satır 2: // Kuyruk Sınırını 5 öğeye ayarla

3. satır: #include<stdio.h>

4. satır: #define LIM 5

Satır 5: // (2) Kuyruk Veri Türü Bildirimleri

Satır 6: // veriler, verileri tutar; delPos, silinecek konum; uzunluk, hayır. ile ilgili

Satır 7: // şu anda kuyrukta bulunan öğeler

8. satır: typedef yapı kuyruğu {

9. satır: int veri[LIM], delPos, uzunluk;

10. satır: } Q;

11. Satır: // (3) Küresel Bildirimler

Satır 12: // struct kuyruk türünün işlevler ve global değişkeni q

13. satır: Q q;

14. satır: void ui_Q_Ops(), insertQel(), deleteQel(), displayQels(), initQ();

Satır 15: // (4) Başlatma işleminden sonra UI İşlevini çağırır

16. satır: int ana()

17. satır: {

18. satır: initQ();

19. satır: ui_Q_Ops();

20. satır: 0 döndür;

21. satır: }

22. satır: // (5) Kuyruğu başlat

23. satır: geçersiz initQ()

24. satır: {

25. satır: q.uzunluk = 0;

26. satır: q.delPos = 0;

27. satır: }

Satır 28: // (6) Menü Driven Loop, doğru işlevleri çağırır

29. satır: void ui_Q_Ops()

30. satır: {

31. satır: int seçim=0;

32. satır: karakter girişi[16];

33. satır: while(seçim!=4){

34. satır: printf(” \n ———————-\n “);

35. satır: printf(” 1. Kuyruğa ekle \n “);

36. satır: printf(” 2. Sıradan sil \n “);

37. satır: printf(” 3. Sıra öğelerini göster \n “);

Satır 38: printf(” 4. Programdan çık \n “);

Satır 39: printf(” Seçimi girin: “);

40. satır: if (fgets(input, 15, stdin) != NULL){

41. satır: if (sscanf(input, “%d”, &choice) == 1){

42. satır: geçiş(seçim){

43. satır: durum 1: insertQel();

44. satır: ara;

45. satır: durum 2: deleteQel();

46. ​​satır: ara;

47. satır: durum 3: displayQels();

48. satır: ara;

49. satır: durum 4: dönüş;

50. satır: varsayılan: printf(“Geçersiz seçim\n “);

51. satır: devam;

52. satır: }

53. satır: } else

54. satır: printf(” Geçersiz seçim \n “);

55. satır: }

56. satır: }

57. satır: }

Satır 58: // (7) Kuyruğa Ekle

Satır 59: // Eğer uzunluk MAX Limit ile aynıysa, sıra doludur, Aksi takdirde

Satır 60: // MAX Limit tarafından toplam uzunluk ve delPos modülü ile dairesel olarak elde edildi

Satır 61: // ve artış uzunluğu

62. satır: geçersiz insertQel()

63. satır: {

64. satır: int el, inspos;

65. satır: karakter girişi[16];

Satır 66: if (q.uzunluk == LIM){

Satır 67: printf(” Kuyruk dolu \n “);

68. satır: dönüş;

69. satır: }

70. satır: inspos = (q.delPos + q.uzunluk) % LIM;

Satır 71: printf(” Eklenecek öğeyi girin: “);

72. satır: if (fgets(input, 15, stdin) != NULL){

73. satır: if (sscanf(input, “%d”, &el)){

74. satır: q.data[inspos] = el;

75. satır: q.uzunluk++;

76. satır: } başka

Satır 77: printf(” Geçersiz giriş \n “);

78. satır: }

79. satır: }

Satır 80: // (8) Kuyruktan Sil

Satır 81: // Uzunluk 0 ise kuyruk boş, yoksa delPos'ta silin

Satır 82: // ve eksiltme uzunluğu

Satır 83: geçersiz deleteQel()

84. satır: {

85. satır: if (q.uzunluk == 0){

Satır 86: printf(” Kuyruk boş \n “);

Satır 87: } başka {

Satır 88: printf(” Silinen öğe %d \n “, q.data[q.delPos]);

Satır 89: q.delPos = (q.delPos + 1) % LIM;

90. satır: q.uzunluk–;

91. satır: }

92. satır: }

Satır 93: // (9) Kuyruk öğelerini görüntüle

Satır 94: // delPos'ta başlayan bir döngü çalıştıran dairesel bir şekilde görüntüleyin

Satır 95: // ve Max Limit ile yineleyici ve modül ekleme

Satır 96: void displayQels()

97. satır: {

Satır 98: int i;

Satır 99: if (q.uzunluk == 0){

Satır 100: printf(” Kuyruk boş \n “);

Satır 101: } başka {

Satır 102: printf(” Kuyruk öğeleri şunlardır: “);

Satır 103: for(i = 0; i < q.uzunluk; i++){

Satır 104: printf(“%d “, q.data[(q.delPos+i)%LIM]);

Satır 105: }

Satır 106: printf(” \n “);

Satır 107: }

108 numaralı satır: }

109. satır:

Çıktılar:

Dairesel Kuyrukta İşlemler

1. insertQel() – Dairesel Kuyruğa bir eleman ekleme

Dairesel bir kuyrukta, dairesel kuyruğa bir öğe eklemek için enQueue() işlevi kullanılır. Dairesel bir kuyrukta, yeni özellik her zaman arka konuma eklenir. enQueue() işlevi, parametre olarak bir tamsayı değeri alır ve onu dairesel kuyruğa ekler. Dairesel kuyruğa bir eleman eklemek için aşağıdaki adımlar uygulanır:

Adım 1 – Uzunluğun MAX Limit ile aynı olup olmadığını kontrol edin. Doğruysa, kuyruğun FULL olduğu anlamına gelir. FULL ise, “Queue is full” yazıp işlevi sonlandırın.

Adım 2 – DOLU DEĞİLSE, toplam uzunluk ve delPos modülü ile dairesel olarak elde edilen değeri MAX Limit ve artış uzunluğu ile girin

2. deleteQel() – Dairesel Kuyruktan bir öğenin silinmesi

Dairesel bir kuyrukta, deQueue() dairesel kuyruktan bir elemanı silmek için kullanılan bir fonksiyondur. Dairesel bir kuyrukta, eleman her zaman ön konumdan silinir. deQueue() işlevi parametre olarak herhangi bir değer almaz. Dairesel kuyruktan bir öğeyi silmek için aşağıdaki adımlar uygulanır…

Adım 1 – Sıranın BOŞ olup olmadığını kontrol edin. (ön == -1 && arka == -1)

Adım 2 – BOŞ ise, "Sıra boş" ifadesini görüntüleyin ve işlevi sonlandırın.

Adım 3 – BOŞ DEĞİLSE, silinen öğeleri konumlarına göre görüntüleyin. Her öğe eklendikten sonra, bir sonraki konum mod kuyruğu sınırına geçin.

3. displayQels() – Dairesel Kuyrukta bulunan Kuyruk öğelerini görüntüler. Dairesel bir kuyruğun öğelerini görüntülemek için aşağıdaki adımlar uygulanır:

Adım 1 – Kuyruğun BOŞ olup olmadığını kontrol edin.

Adım 2 – Uzunluk 0 ise BOŞ'tur, ardından “Kuyruk boş” ifadesini görüntüleyin ve işlevi sonlandırın.

Adım 3 – BOŞ DEĞİLSE, bir 'i' tamsayı değişkeni tanımlayın.

Adım 4 – i'yi 0'a ayarlayın.

Adım 5 – Elemanları pozisyona göre ve birer birer artış değerine göre görüntüleyin (i++). 'i <q.length' YANLIŞ olana kadar aynı işlemi tekrarlayın.

Dairesel Kuyruk, bağlantılı liste kullanılarak da uygulanabilir. Aşağıdaki algoritmalar şunlardır:

  • Sıraya Algoritma:

if (FRONT == NULL) // Boş Kuyruğa Ekleme

ÖN = ARKA = yeniDüğüm

eğer son

Başka

REAR -> next = newNode // Son elemandan sonra ekleme

ARKA = yeniDüğüm

başka son

ARKA -> sonraki = ÖN

Sıralamayı Bitir

  • Dequeue için Algoritma:

if(FRONT == NULL) // Taşma koşulu

"Sıra Akışı" yazdır

Dequeue'yu sonlandır

eğer son

else if(FRONT == REAR) // Kuyruk yalnızca bir düğüm içeriyor

sıcaklık = ÖN -> veri

ücretsiz (geçici)

ÖN = ÖN -> sonraki

ARKA -> sonraki = ÖN

eğer son

else if (FRONT == N – 1) // FRONT son düğüm ise

front = 0 // İlk düğüm olarak FRONT yap

eğer son

Dequeue'yu sonlandır

Ayrıca Okuyun: Python Vs C: Komple Yan Yana Karşılaştırma

Çözüm

Veri Yapıları ve Algoritmalar, sadece C programlamada değil, diğer dillerde de büyük önem taşımaktadır. Değeri emsalsizdir ve bu kadar önemli konular için, portföyünüze mükemmel bir değer katacak uzmanlar tarafından tasarlanan ve yönlendirilen kurslara yatırım yapmak daha iyidir. upGrad, yalnızca becerilerinizi geliştirmekle kalmayıp aynı zamanda güçlü temeller oluşturan çok çeşitli güçlü kurslar sunar.

Yüksek itibarlı IIIT-B tarafından tasarlanmıştır, burada yalnızca üstün kaliteli içerik sağlamakla kalmaz, aynı zamanda sizi aynı kariyer yolunda gelişen insanlarla ve aynı zamanda sektördeki uzmanlarla bağlantı kuracağınız güçlü bir ağın parçası yapar. şüphelerinizi giderin ve her zaman sizi destekleyin.

Onların zihniyetlerini ve düşünce süreçlerini tanımak size yardımcı olacaktır. Ve upGrad'da elde ettiğiniz benzersiz şeylerden biri de, EMI seçeneklerini tercih edebilmeniz ve cebinizden kolayca çıkabilmenizdir.

Bu C projelerini yürütürken mükemmel bir öğrenme fırsatına sahip olacağınızı umuyoruz. Daha fazla bilgi edinmek istiyorsanız ve sektör uzmanlarından mentorluğa ihtiyacınız varsa, tam Yığın Yazılım Geliştirme alanında upGrad & IIIT Banglore'un PG Diplomasına göz atın.

Geleceğin Kariyerine Hazırlanın

YÜKSELTME VE IIIT-BANGALORE'NİN PG DİPLOMASI FULL STACK YAZILIM GELİŞTİRMEDE
Şimdi Uygula