c circular queue data structure
C ++ Dairesel Kuyruk Veri Yapısı Üzerine Bu Eğitimde Dairesel Kuyruk Nedir, Uygulama ve Uygulamalar ile birlikte Temel İşlemler Nelerdir:
Döngüsel bir kuyruk, daha önce tartıştığımız temel kuyruğun bir uzantısıdır. 'Ring buffer' olarak da bilinir.
C ++ 'da Dairesel Sıra nedir?
Dairesel bir kuyruk, veri öğelerini depolamak için kullanılan doğrusal bir veri yapısıdır. FIFO (İlk Giren, İlk Çıkar) yaklaşımını takip ederek işlemleri gerçekleştirir ve kuyruktaki son konum bir daire oluşturacak şekilde tekrar ilk konuma bağlanır.
=> Tüm C ++ Eğitim Serisini Burada Arayın
Ne öğreneceksin:
C ++ 'da Dairesel Sıra
Aşağıdaki diyagramda dairesel bir sıra gösterilmektedir.
Yukarıdaki görüntü, 10 boyutunda dairesel bir veri yapısını göstermektedir. İlk altı öğe zaten kuyruktadır ve ilk konum ile son konumun birleştirildiğini görüyoruz. Bu düzenleme nedeniyle, doğrusal bir kuyrukta olduğu için alan boşa gitmez.
vr kutusu için en iyi vr uygulamaları
Sıra dolduktan sonra doğrusal bir kuyrukta, diğer uçtan öğeleri siliyoruz ve kuyruğun durumu hala dolu olarak gösteriliyor ve daha fazla öğe ekleyemiyoruz.
Dairesel kuyrukta sıra dolduğunda ve son ve ilk konumlar bağlandıktan sonra önden elemanlar çıkardığımızda, arka kısımda boşalan elemanları elemanın silinmesi ile ekleyebiliriz.
Bir sonraki bölümde, döngüsel kuyruğun temel işlemlerini öğreneceğiz.
Temel işlemler
Dairesel kuyruğun temel işlemlerinden bazıları aşağıdaki gibidir:
Ön: Ön konumu dairesel kuyrukta döndürür.
Arka: Arka konumu dairesel sırada döndürür.
Sıraya almak: Enqueue (değer), dairesel kuyruğa bir öğe eklemek için kullanılır. Öğe her zaman sıranın arka ucuna eklenir.
Dairesel kuyruğa yeni bir eleman eklemek için aşağıdaki adımları izliyoruz.
# 1) Dairesel sıranın dolu olup olmadığını kontrol edin: test edin ((arka == SIZE-1 && front == 0) || (arka == ön-1)), burada 'BOYUT' dairesel sıranın boyutudur.
#iki) Dairesel sıra doluysa, “Kuyruk dolu” olarak bir mesaj görüntüler. Sıra dolu değilse, kontrol edin (arka == SIZE - 1 && front! = 0). Doğruysa, arka = 0 olarak ayarlayın ve öğeyi ekleyin.
Sıradan çıkarma: Kuyruktan çıkarma işlevi, kuyruktan bir öğeyi silmek için kullanılır. Döngüsel kuyrukta, öğe her zaman ön uçtan silinir. Aşağıda, döngüsel bir kuyruktaki kuyruktan çıkarma işlemi için sıra verilmiştir.
Adımlar:
# 1) Dairesel sıranın Boş olup olmadığını kontrol edin: kontrol edin (ön == - 1).
çevrimiçi izlemek için ücretsiz anime siteleri
#iki) Boşsa, 'Kuyruk boş' mesajını görüntüleyin. Kuyruk boş değilse 3. adımı gerçekleştirin.
# 3) (Ön == arka) olup olmadığını kontrol edin. Doğruysa front = rear = -1 olarak ayarlayın, aksi takdirde (front == size-1) olup olmadığını kontrol edin, eğer doğruysa front = 0 olarak ayarlayın ve öğeyi geri döndürün.
İllüstrasyon
Bu bölümde, döngüsel kuyruğa eleman ekleme / çıkarma ile ilgili ayrıntılı bir çizimden geçeceğiz.
Aşağıda gösterildiği gibi 5 öğeden oluşan aşağıdaki dairesel sırayı göz önünde bulundurun:
Ardından, sıraya madde 1'i ekliyoruz.
Ardından, değeri 3 olan bir öğe ekliyoruz.
Bir kuyruğu doldurmak için öğeleri eklediğimizde, gösterim aşağıda gösterildiği gibi olacaktır.
Şimdi iki öğeyi, yani öğe 1 ve öğe 3'ü aşağıda gösterildiği gibi kuyruktan siliyoruz.
Daha sonra, aşağıda gösterildiği gibi dairesel kuyruğa eleman 11'i ekleriz veya sıraya koyarız.
Yine dairesel kuyruğa 13 numaralı elemanı ekleyelim. Sıra aşağıda gösterildiği gibi görünecektir.
Dairesel kuyrukta bir daireye elemanlar yerleştirdiğimizi veya taşıdığımızı görüyoruz. Dolayısıyla, kuyruğun tüm alanını dolana kadar tüketebiliriz.
Uygulama
C ++ kullanarak dairesel sırayı uygulayalım.
#include using namespace std; class Queue { public: // Initialize front and rear int rear, front; // Circular Queue int size; int *circular_queue; Queue(int sz) { front = rear = -1; size = sz; circular_queue = new int(sz); } void enQueue(int elem); int deQueue(); void displayQueue(); }; /* Function to create Circular queue */ void Queue::enQueue(int elem) { if ((front == 0 && rear == size-1) || (rear == (front-1)%(size-1))) { cout<<'
Queue is Full'; return; } else if (front == -1) { /* Insert First Element */ front = rear = 0; circular_queue(rear) = elem; } else if (rear == size-1 && front != 0) { rear = 0; circular_queue(rear) = elem; } else { rear++; circular_queue(rear) = elem; } } // Function to delete element from Circular Queue int Queue::deQueue() { if (front == -1) { cout<<'
Queue is Empty'; return -1; } int data = circular_queue(front); circular_queue(front) = -1; if (front == rear) { front = -1; rear = -1; } else if (front == size-1) front = 0; else front++; return data; } //display elements of Circular Queue void Queue::displayQueue() { if (front == -1) { cout<<'
Queue is Empty'<= front) { for (int i = front; i <= rear; i++) cout< Yukarıda, dairesel kuyruk işlemlerinin çıktısı gösterilmektedir. Önce öğeleri ekleriz ve ardından iki öğeyi sıradan çıkarırız veya kaldırırız. Daha sonra, dairesel sıraya üç öğe daha ekleriz veya sıraya koyarız. Doğrusal sıranın aksine, elemanların sıranın sonuna eklendiğini görüyoruz.
Bağlantılı Liste Uygulaması
Şimdi döngüsel bir sıranın bağlantılı liste uygulamasını tartışalım. Aşağıda, C ++ 'daki döngüsel kuyruğun bağlantılı liste uygulaması verilmiştir. Her düğümü temsil etmek için struct'ı kullandığımıza dikkat edin. İşlemler, bu durumda, bunları bağlantılı liste düğümlerine göre gerçekleştirmemiz dışında daha önce tartışılanlarla aynıdır.
Çıktı, kuyruğa alma işlemi, kuyruktan çıkarma ve ayrıca ikinci kuyruğa alma işleminden sonra dairesel kuyruğu gösterir.
#include using namespace std; struct Node { int data; struct Node* link; }; struct PQueue { struct Node *front, *rear; }; /* this functions performs enqueue operation for circular queue */ void enQueue(PQueue *pq,int elem) { struct Node *temp = new Node; temp->data = elem; if (pq->front == NULL) pq->front = temp; else pq->rear->link = temp; pq->rear = temp; pq->rear->link = pq->front; } // This function performs dequeue operation for Circular Queue int deQueue(PQueue *pq) { if (pq->front == NULL) { cout<<'Queue is empty!!'; return -1; } int elem; // item to be dequeued // item is the last node to be deleted if (pq->front == pq->rear) { elem = pq->front->data; free(pq->front); pq->front = NULL; pq->rear = NULL; } else //more than one nodes { struct Node *temp = pq->front; elem = temp->data; pq->front = pq->front->link; pq->rear->link= pq->front; free(temp); } return elem ; } //display elements of Circular Queue void displayQueue(struct PQueue *pq) { struct Node *temp = pq->front; while (temp->link != pq->front) { cout<data<<' '; temp = temp->link; } cout<data; } //main program int main() { // Create a circular queue and initialize front and rear PQueue *pq = new PQueue; pq->front = pq->rear = NULL; // Insert/enqueue elements in Circular Queue enQueue(pq, 1); enQueue(pq, 3); enQueue(pq, 5); cout<<'
Circular Queue elements after enqueue operation: '; // Display elements in Circular Queue displayQueue(pq); // Delete/dequeue elements from Circular Queue cout<<'
Dequeued Item: '< Çıktı:
Sonraki uygulama, bağlantılı listeyi kullanarak döngüsel sırayı gösteren bir Java programıdır.
import java.util.* ; class Main { // Node structure static class Node { int data; Node link; } static class CQueue { Node front, rear; } // Enqueue operation for circular queue static void enQueue(CQueue cq, int value) { Node temp = new Node(); temp .data = value; if (cq .front == null) cq .front = temp; else cq .rear .link = temp; cq .rear = temp; cq .rear .link = cq .front; } // Dequeue operation for Circular Queue static int deQueue(CQueue cq) { if (cq .front == null) { System.out.printf ('Queue is empty!!'); return Integer.MIN_VALUE; } int value; // Value to be dequeued // the last node to be deleted if (cq.front == cq.rear) { value = cq.front.data; cq.front = null; cq.rear = null; } else { // There are more than one nodes Node temp = cq.front; value = temp.data; cq.front = cq.front.link; cq.rear.link= cq.front; } return value ; } // display the elements of Circular Queue static void displayQueue( CQueue cq) { Node temp = cq.front; while (temp.link != cq.front) { System.out.printf('%d ', temp.data); temp = temp.link; } System.out.printf('%d', temp.data); } /* main program */ public static void main(String args()) { // Create a queue and initialize front and rear CQueue cq = new CQueue(); cq.front = cq.rear = null; // Insert/enqueue elements in Circular Queue enQueue(cq, 2); enQueue(cq, 4); enQueue(cq, 6); System.out.print('
Circular Queue elements after Enqueue Operation:'); // Display elements in Circular Queue displayQueue(cq); // Delete/dequeue elements from Circular Queue System.out.printf('
Dequeued Item = %d', deQueue(cq)); System.out.printf('
Dequeued Item = %d', deQueue(cq)); System.out.print('
Circular Queue elements after Dequeue Operation:'); displayQueue(cq); enQueue(cq, 8); enQueue(cq, 10); System.out.print('
Circular Queue elements after second Enqueue Operation:'); displayQueue(cq); } }
Çıktı:
Yukarıdaki programın çıktısı önceki programa benzer.
Uygulamalar
Döngüsel kuyruğun bazı uygulamalarını tartışalım.
- CPU Planlama: Bazı olayların gerçekleşmesini veya diğer bazı işlemlerin yürütülmesi için tamamlanmasını gerektiren işletim sistemi süreci, genellikle tüm koşullar karşılandığında veya tüm olaylar gerçekleştiğinde birbiri ardına yürütülmeleri için döngüsel bir kuyrukta tutulur.
- Hafıza yönetimi: Sıradan kuyrukların kullanılması, yukarıdaki tartışmamızda daha önce belirtildiği gibi bellek alanını boşa harcar. Bellek yönetimi için döngüsel bir kuyruk kullanmak, optimum bellek kullanımı için faydalıdır.
- Bilgisayar Kontrollü Trafik Sinyal Sistemi: Bilgisayarlı trafik sinyalleri, genellikle belirtilen zaman aralığı geçtikten sonra kendilerini tekrar etmeleri için dairesel bir kuyruğa eklenir.
Sonuç
Dairesel kuyruklar, normal bir kuyruğun en büyük dezavantajını düzeltir; burada arka işaretçi, öğeleri sildiğimizde ve boşluk boşaldığında bile arka işaretçi kuyruğun sonundayken öğe ekleyemeyiz. Dairesel bir kuyrukta, elemanlar dairesel bir şekilde düzenlenir, böylece alan boşa harcanmaz.
Dairesel kuyruğun ana işlemlerini de gördük. Dairesel kuyruklar çoğunlukla zamanlama amaçları ve sinyallerin sırayla parladığı trafik sinyal sistemleri gibi uygulamalar için kullanışlıdır.
c ++ 'da 0 ile 100 arasında rasgele sayılar nasıl oluşturulur
Bir sonraki eğitimimizde, basitçe 'deque' olarak adlandırılan çift uçlu kuyruklar hakkında bilgi edineceğiz.
=> Sıfırdan C ++ Öğrenmek İçin Burayı Ziyaret Edin
Önerilen Kaynaklar
- Çizim ile C ++ 'da Kuyruk Veri Yapısı
- Çizim ile C ++ 'da Öncelik Sırası Veri Yapısı
- Çizim ile C ++ 'da Dairesel Bağlantılı Liste Veri Yapısı
- Data Mart Eğitimi - Data Mart Türleri, Örnekleri ve Uygulaması
- Çizimle C ++ 'da Yığın Veri Yapısı
- Veri Madenciliği Örnekleri: Veri Madenciliğinin En Yaygın Uygulamaları 2021
- C ++ 'da İkili Ağaç Veri Yapısı
- STL'de Öncelik Sırası