logo

Dairesel Sıra

Neden dairesel kuyruk kavramı ortaya atıldı?

Dizi uygulamasında bir sınırlama vardı

Yukarıdaki resimde de görebileceğimiz gibi arka kısım Sıranın son konumunda ve ön kısım 0 yerine bir yeri işaret ediyor.bukonum. Yukarıdaki dizide yalnızca iki öğe vardır ve diğer üç konum boştur. Arka kısım Kuyruğun son konumundadır; eğer elemanı eklemeye çalışırsak, Kuyrukta hiç boş alan olmadığını gösterecektir. Bu tür bellek alanı israfını önlemek için her iki öğeyi de sola kaydırarak ön ve arka ucu buna göre ayarlayarak bir çözüm vardır. Bu pratik olarak iyi bir yaklaşım değildir çünkü tüm unsurların değiştirilmesi çok fazla zaman alacaktır. Bellek israfını önlemek için etkili yaklaşım, döngüsel kuyruk veri yapısını kullanmaktır.

Dairesel Kuyruk Nedir?

Dairesel bir kuyruk, aynı zamanda FIFO (İlk Giren İlk Çıkar) ilkesine dayandığından doğrusal bir sıraya benzer, tek fark, son konumun bir daire oluşturan dairesel bir kuyrukta ilk konuma bağlanmasıdır. Aynı zamanda şu şekilde de bilinir: Halka Tamponu .

Döngüsel Sıradaki İşlemler

Döngüsel bir kuyrukta gerçekleştirilebilecek işlemler şunlardır:

    Ön:Kuyruktan ön elemanı almak için kullanılır.Arka:Kuyruktan arka elemanı almak için kullanılır.enQueue(değer):Bu fonksiyon Kuyruğa yeni değer eklemek için kullanılır. Yeni eleman her zaman arka uçtan eklenir.deQueue():Bu işlev Kuyruktan bir öğeyi siler. Bir Kuyruktaki silme işlemi her zaman ön uçtan gerçekleşir.

Dairesel Kuyruk Uygulamaları

Dairesel Kuyruk aşağıdaki senaryolarda kullanılabilir:

    Bellek yönetimi:Dairesel kuyruk bellek yönetimi sağlar. Daha önce de gördüğümüz gibi doğrusal kuyrukta bellek çok verimli yönetilmiyor. Ancak dairesel bir kuyruk olması durumunda, elemanların kullanılmayan bir konuma yerleştirilmesiyle bellek verimli bir şekilde yönetilir.CPU Planlaması:İşletim sistemi ayrıca işlemleri eklemek ve daha sonra yürütmek için dairesel kuyruğu kullanır.Trafik sistemi:Bilgisayar kontrollü bir trafik sisteminde trafik ışıkları dairesel kuyruğun en iyi örneklerinden biridir. Trafik ışıklarının her ışığı, her zaman aralığından sonra birer birer YANAR. Kırmızı ışığın bir dakika boyunca yanması, ardından bir dakika boyunca sarı ışığın ve ardından yeşil ışığın yanması gibi. Yeşil ışıktan sonra kırmızı ışık yanar.

Kuyruğa alma işlemi

Kuyruğa alma işleminin adımları aşağıda verilmiştir:

  • Öncelikle Kuyruğun dolu olup olmadığını kontrol edeceğiz.
  • Başlangıçta ön ve arka -1'e ayarlanmıştır. Bir Kuyruğa ilk elemanı eklediğimizde ön ve arka ikisi de 0'a set edilir.
  • Yeni bir eleman eklediğimizde arka kısım artar, yani arka=arka+1 .

Bir öğenin eklenmesine ilişkin senaryolar

Kuyruğun dolu olmadığı iki senaryo vardır:

    Arka ise != maks - 1, daha sonra arka kısım şu değere artırılacaktır: mod(maksimum boyut) ve yeni değer kuyruğun arka ucuna eklenecektir.Ön != 0 ve arka = max - 1 ise, bu kuyruğun dolu olmadığı anlamına gelir, ardından arka değerini 0 olarak ayarlayın ve yeni öğeyi buraya ekleyin.

Öğenin eklenemeyeceği iki durum vardır:

hashset java
  • Ne zaman ön ==0 && arka = maksimum-1 bu, ön tarafın Kuyruğun ilk konumunda, arkanın ise Kuyruğun son konumunda olduğu anlamına gelir.
  • ön== arka + 1;

Dairesel bir kuyruğa öğe ekleme algoritması

Aşama 1: IF (ARKA+1)%MAX = ÖN
'TAŞMA' yaz
4. adıma git
[IF'nin sonu]

Adım 2: ÖN = -1 ve ARKA = -1 İSE
ÖN AYAR = ARKA = 0
ELSE IF REAR = MAX - 1 ve FRONT ! = 0
ARKA AYAR = 0
BAŞKA
ARKA AYAR = (ARKA + 1) % MAX
[IF'NİN SONU]

Aşama 3: KUYRUĞU AYARLA[ARKA] = VAL

Adım 4: ÇIKIŞ

Kuyruktan Çıkarma Operasyonu

Kuyruktan çıkarma işleminin adımları aşağıda verilmiştir:

  • Öncelikle Kuyruğun boş olup olmadığını kontrol ediyoruz. Kuyruk boş ise kuyruktan çıkarma işlemini gerçekleştiremeyiz.
  • Eleman silindiğinde front değeri 1 azaltılır.
  • Silinecek tek bir eleman kaldıysa ön ve arka -1'e sıfırlanır.

Bir öğeyi dairesel kuyruktan silme algoritması

Aşama 1: ÖN İSE = -1
'EKSİK AKIŞ' yaz
4. Adıma Git
[IF'nin sonu]

Adım 2: AYAR DEĞERİ = KUYRUK[ÖN]

benim canlı kriket.

Aşama 3: ÖN = ARKA İSE
ÖN AYAR = ARKA = -1
BAŞKA
ÖN İSE = MAX -1
ÖN AYAR = 0
BAŞKA
ÖN AYAR = ÖN + 1
[IF'nin sonu]
[IF'NİN SONU]

Adım 4: ÇIKIŞ

Sıralama ve kuyruktan çıkarma işlemini diyagramatik gösterimle anlayalım.

Dairesel Sıra
Dairesel Sıra
Dairesel Sıra
Dairesel Sıra
Dairesel Sıra
Dairesel Sıra
Dairesel Sıra
Dairesel Sıra

Array kullanarak dairesel kuyruğun uygulanması

 #include # define max 6 int queue[max]; // array declaration int front=-1; int rear=-1; // function to insert an element in a circular queue void enqueue(int element) { if(front==-1 && rear==-1) // condition to check queue is empty { front=0; rear=0; queue[rear]=element; } else if((rear+1)%max==front) // condition to check queue is full { printf('Queue is overflow..'); } else { rear=(rear+1)%max; // rear is incremented queue[rear]=element; // assigning a value to the queue at the rear position. } } // function to delete the element from the queue int dequeue() { if((front==-1) && (rear==-1)) // condition to check queue is empty { printf('
Queue is underflow..'); } else if(front==rear) { printf('
The dequeued element is %d', queue[front]); front=-1; rear=-1; } else { printf('
The dequeued element is %d', queue[front]); front=(front+1)%max; } } // function to display the elements of a queue void display() { int i=front; if(front==-1 && rear==-1) { printf('
 Queue is empty..'); } else { printf('
Elements in a Queue are :&apos;); while(i<=rear) { printf('%d,', queue[i]); i="(i+1)%max;" } int main() choice="1,x;" variables declaration while(choice<4 && choice!="0)" while loop printf('
 press 1: insert an element'); printf('
press 2: delete 3: display the printf('
enter your choice'); scanf('%d', &choice); switch(choice) case printf('enter element which is to be inserted'); &x); enqueue(x); break; dequeue(); display(); }} return 0; < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/ds-tutorial/14/circular-queue-10.webp" alt="Circular Queue"> <h3>Implementation of circular queue using linked list</h3> <p>As we know that linked list is a linear data structure that stores two parts, i.e., data part and the address part where address part contains the address of the next node. Here, linked list is used to implement the circular queue; therefore, the linked list follows the properties of the Queue. When we are implementing the circular queue using linked list then both the <strong> <em>enqueue and dequeue</em> </strong> operations take <strong> <em>O(1)</em> </strong> time.</p> <pre> #include // Declaration of struct type node struct node { int data; struct node *next; }; struct node *front=-1; struct node *rear=-1; // function to insert the element in the Queue void enqueue(int x) { struct node *newnode; // declaration of pointer of struct node type. newnode=(struct node *)malloc(sizeof(struct node)); // allocating the memory to the newnode newnode-&gt;data=x; newnode-&gt;next=0; if(rear==-1) // checking whether the Queue is empty or not. { front=rear=newnode; rear-&gt;next=front; } else { rear-&gt;next=newnode; rear=newnode; rear-&gt;next=front; } } // function to delete the element from the queue void dequeue() { struct node *temp; // declaration of pointer of node type temp=front; if((front==-1)&amp;&amp;(rear==-1)) // checking whether the queue is empty or not { printf(&apos;
Queue is empty&apos;); } else if(front==rear) // checking whether the single element is left in the queue { front=rear=-1; free(temp); } else { front=front-&gt;next; rear-&gt;next=front; free(temp); } } // function to get the front of the queue int peek() { if((front==-1) &amp;&amp;(rear==-1)) { printf(&apos;
Queue is empty&apos;); } else { printf(&apos;
The front element is %d&apos;, front-&gt;data); } } // function to display all the elements of the queue void display() { struct node *temp; temp=front; printf(&apos;
 The elements in a Queue are : &apos;); if((front==-1) &amp;&amp; (rear==-1)) { printf(&apos;Queue is empty&apos;); } else { while(temp-&gt;next!=front) { printf(&apos;%d,&apos;, temp-&gt;data); temp=temp-&gt;next; } printf(&apos;%d&apos;, temp-&gt;data); } } void main() { enqueue(34); enqueue(10); enqueue(23); display(); dequeue(); peek(); } </pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/ds-tutorial/14/circular-queue-11.webp" alt="Circular Queue"> <hr></=rear)>

Çıktı:

Dairesel Sıra