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:
Dairesel Kuyruk Uygulamaları
Dairesel Kuyruk aşağıdaki senaryolarda kullanılabilir:
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:
Öğ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.
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 :'); 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->data=x; newnode->next=0; if(rear==-1) // checking whether the Queue is empty or not. { front=rear=newnode; rear->next=front; } else { rear->next=newnode; rear=newnode; rear->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)&&(rear==-1)) // checking whether the queue is empty or not { printf(' Queue is empty'); } else if(front==rear) // checking whether the single element is left in the queue { front=rear=-1; free(temp); } else { front=front->next; rear->next=front; free(temp); } } // function to get the front of the queue int peek() { if((front==-1) &&(rear==-1)) { printf(' Queue is empty'); } else { printf(' The front element is %d', front->data); } } // function to display all the elements of the queue void display() { struct node *temp; temp=front; printf(' The elements in a Queue are : '); if((front==-1) && (rear==-1)) { printf('Queue is empty'); } else { while(temp->next!=front) { printf('%d,', temp->data); temp=temp->next; } printf('%d', temp->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ı:
=rear)>