queue data structure c with illustration
Çizimle C ++ 'da Sıraya Kısa Bir Giriş.
Kuyruk, tıpkı bir yığın gibi temel bir veri yapısıdır. LIFO yaklaşımını kullanan yığının aksine, kuyruk FIFO (ilk giren ilk çıkar) yaklaşımını kullanır. Bu yaklaşımla kuyruğa eklenen ilk öğe, kuyruktan kaldırılacak ilk öğedir. Tıpkı Stack gibi, kuyruk da doğrusal bir veri yapısıdır.
c ve c ++ arasındaki temel farklar
Gerçek dünya benzetmesinde, yolcuların bir kuyrukta veya bir sırada otobüsü beklediği bir otobüs kuyruğu hayal edebiliriz. Sıradaki ilk yolcu otobüse ilk girer, çünkü ilk gelen yolcu olur.
=> Popüler C ++ Eğitim Serisini Buradan Okuyun.
Ne öğreneceksin:
C ++ 'da Sıra
Yazılım açısından, kuyruk aşağıda gösterildiği gibi bir dizi veya öğe koleksiyonu olarak görüntülenebilir. Elemanlar doğrusal olarak düzenlenmiştir.
Sıranın 'önünde' ve 'arkasında' olmak üzere iki ucumuz var. Sıra boş olduğunda, her iki işaretçi de -1'e ayarlanır.
'Arka' uç işaretçisi, öğelerin kuyruğa eklendiği yerdir. Kuyruğa eleman ekleme / ekleme işlemine 'sıraya alma' denir.
'Ön' uç işaretçisi, öğelerin kuyruktan kaldırıldığı yerdir. Kuyruktaki öğeleri kaldırma / silme işlemine 'kuyruktan çıkarma' adı verilir.
Arka işaretçi değeri size-1 olduğunda, kuyruğun dolu olduğunu söyleriz. Ön boş olduğunda, sıra boştur.
Temel işlemler
Kuyruk veri yapısı aşağıdaki işlemleri içerir:
- Sıraya almak: Sıraya bir öğe ekler. Kuyruğa bir öğe eklenmesi her zaman kuyruğun arkasında yapılır.
- DeQueue: Kuyruktan bir öğeyi kaldırır. Bir öğe her zaman sıranın önünden kaldırılır veya sıradan çıkarılır.
- boş: Sıranın boş olup olmadığını kontrol eder.
- dolu: Sıranın dolu olup olmadığını kontrol eder.
- dikizlemek: Kuyruğun önündeki bir öğeyi kaldırmadan alır.
Sıraya almak
Bu süreçte aşağıdaki adımlar gerçekleştirilir:
- Sıranın dolu olup olmadığını kontrol edin.
- Doluysa, taşma hatası üretin ve çıkın.
- Aksi takdirde, 'geri' artırın.
- 'Arka' ile gösterilen konuma bir öğe ekleyin.
- Başarıya dönüş.
Sıradan çıkarmak
Kuyruktan çıkarma işlemi aşağıdaki adımlardan oluşur:
- Sıranın boş olup olmadığını kontrol edin.
- Boşsa, bir alt akış hatası görüntüleyin ve çıkın.
- Aksi takdirde, erişim öğesi 'ön' ile gösterilir.
- Erişilebilir bir sonraki veriye işaret etmek için 'ön' yi artırın.
- Başarıya dönüş.
Ardından, sıradaki ekleme ve silme işlemlerinin ayrıntılı bir resmini göreceğiz.
İllüstrasyon
Bu boş bir kuyruk ve bu nedenle arka ve boş olarak -1'e setimiz var.
Ardından kuyruğa 1 ekliyoruz ve sonuç olarak arka işaretçi bir konum ilerliyor.
Sonraki şekilde, arka işaretçiyi başka bir artışla ileri doğru hareket ettirerek sıraya eleman 2'yi ekliyoruz.
Aşağıdaki şekilde, eleman 3'ü ekliyoruz ve arka işaretçiyi 1 hareket ettiriyoruz.
Bu noktada, arka işaretçi 2 değerine sahipken ön işaretçi 0'dadır.inciyer.
Ardından, ön işaretçinin gösterdiği öğeyi siliyoruz. Ön işaretçi 0'da olduğu için silinen öğe 1'dir.
Böylece sıraya girilen ilk eleman, yani 1, kuyruktan çıkarılan ilk elemandır. Sonuç olarak, ilk kuyruktan çıktıktan sonra, ön işaretçi şimdi bir sonraki konum olan 1 olan t0 ilerisine hareket ettirilecektir.
Queue İçin Dizi Uygulaması
Sıra veri yapısını C ++ kullanarak uygulayalım.
#include #define MAX_SIZE 5 using namespace std; class Queue { private: int myqueue(MAX_SIZE), front, rear; public: Queue(){ front = -1; rear = -1; } boolisFull(){ if(front == 0 && rear == MAX_SIZE - 1){ return true; } return false; } boolisEmpty(){ if(front == -1) return true; else return false; } void enQueue(int value){ if(isFull()){ cout << endl<< 'Queue is full!!'; } else { if(front == -1) front = 0; rear++; myqueue(rear) = value; cout << value << ' '; } } int deQueue(){ int value; if(isEmpty()){ cout << 'Queue is empty!!' <= rear){ //only one element in queue front = -1; rear = -1; } else { front++; } cout << endl < ' << value << ' from myqueue'; return(value); } } /* Function to display elements of Queue */ void displayQueue() { int i; if(isEmpty()) { cout << endl << 'Queue is Empty!!' << endl; } else { cout << endl << 'Front = ' << front; cout << endl << 'Queue elements : '; for(i=front; i<=rear; i++) cout << myqueue(i) << ' '; cout << endl << 'Rear = ' << rear << endl; } } }; int main() { Queue myq; myq.deQueue(); //deQueue cout<<'Queue created:'< queue is full myq.enQueue(60); myq.displayQueue(); //deQueue =>removes 10 myq.deQueue(); //queue after dequeue myq.displayQueue(); return 0; }
Çıktı:
Sıra boş !!
Kuyruk oluşturuldu:
10 20 30 40 50
Sıra dolu !!
Ön = 0
Sıra öğeleri: 10 20 30 40 50
Arka = 4
Myqueue'dan => 10 silindi
Ön = 1
Sıra öğeleri: 20 30 40 50
Arka = 4
Yukarıdaki uygulama, bir dizi olarak temsil edilen kuyruğu gösterir. Dizi için max_size belirtiyoruz. Ayrıca, kuyruğa alma ve kuyruktan çıkarma işlemlerinin yanı sıra isFull ve isEmpty işlemlerini de tanımlıyoruz.
Aşağıda, kuyruk veri yapısının Java uygulaması verilmiştir.
// A class representing a queue class Queue { int front, rear, size; int max_size; int myqueue(); public Queue(int max_size) { this.max_size = max_size; front = this.size = 0; rear = max_size - 1; myqueue = new int(this.max_size); } //if size = max_size , queue is full boolean isFull(Queue queue) { return (queue.size == queue.max_size); } // size = 0, queue is empty boolean isEmpty(Queue queue) { return (queue.size == 0); } // enqueue - add an element to the queue void enqueue( int item) { if (isFull(this)) return; this.rear = (this.rear + 1)%this.max_size; this.myqueue(this.rear) = item; this.size = this.size + 1; System.out.print(item + ' ' ); } // dequeue - remove an elment from the queue int dequeue() { if (isEmpty(this)) return Integer.MIN_VALUE; int item = this.myqueue(this.front); this.front = (this.front + 1)%this.max_size; this.size = this.size - 1; return item; } // move to front of the queue int front() { if (isEmpty(this)) return Integer.MIN_VALUE; return this.myqueue(this.front); } // move to the rear of the queue int rear() { if (isEmpty(this)) return Integer.MIN_VALUE; return this.myqueue(this.rear); } } // main class class Main { public static void main(String() args) { Queue queue = new Queue(1000); System.out.println('Queue created as:'); queue.enqueue(10); queue.enqueue(20); queue.enqueue(30); queue.enqueue(40); System.out.println('
Element ' + queue.dequeue() + ' dequeued from queue
'); System.out.println('Front item is ' + queue.front()); System.out.println('Rear item is ' + queue.rear()); } }
Çıktı:
Sıra şu şekilde oluşturuldu:
10 20 30 40
Sıradan çıkarılmış öğe 10
Ön öğe 20
Arka öğe 40
Yukarıdaki uygulama C ++ uygulamasına benzer.
Ardından, sırayı bağlantılı bir liste kullanarak C ++ 'da uygulayalım.
Sıra için Bağlantılı Liste Uygulaması:
#include using namespace std; struct node { int data; struct node *next; }; struct node* front = NULL; struct node* rear = NULL; struct node* temp; void Insert(int val) { if (rear == NULL) { rear = new node; rear->next = NULL; rear->data = val; front = rear; } else { temp=new node; rear->next = temp; temp->data = val; temp->next = NULL; rear = temp; } } void Delete() { temp = front; if (front == NULL) { cout<<'Queue is empty!!'next; cout<<'Element deleted from queue is : ' Çıktı:
Kuyruk Oluşturuldu:
10 20 30 40 50
Sıradan silinen öğe: 10
Bir silme işleminden sonra sıra:
20 30 40 50
en iyi bedava mp3 indirici nedir
Yığın Vs. Kuyruk
Yığınlar ve kuyruklar, verileri depolamak için kullanılabilen ikincil veri yapılarıdır. Diziler ve bağlantılı listeler gibi birincil veri yapıları kullanılarak programlanabilirler. Her iki veri yapısını ayrıntılı olarak tartıştıktan sonra, bu iki veri yapısı arasındaki temel farklılıkları tartışmanın zamanı geldi.
Yığınlar Kuyruklar LIFO (Son giren, İlk çıkar) yaklaşımını kullanır. FIFO (İlk giren, İlk çıkar) yaklaşımını kullanır. Öğeler, yığının 'Üstü' olarak adlandırılan yalnızca bir ucundan eklenir veya silinir. Öğeler, sıranın 'Arka' ucundan eklenir ve sıranın 'önünden' kaldırılır. Yığın için temel işlemler 'itme' ve 'Pop' dur. Bir kuyruk için temel işlemler 'sıraya alma' ve 'sıradan çıkarma' dır. Yığının tepesine erişmek için yalnızca bir işaretçi tutarak yığın üzerindeki tüm işlemleri yapabiliriz. Kuyruklarda, biri kuyruğun önüne, diğeri kuyruğun arkasına erişmek için iki işaretçi bulundurmamız gerekir. Yığın çoğunlukla özyinelemeli problemleri çözmek için kullanılır. Sıralar, sıralı işlemeyle ilgili sorunları çözmek için kullanılır.
Kuyruk Uygulamaları
Kuyruk veri yapısının çeşitli uygulamalarını aşağıda tartışalım.
- Kuyruk veri yapısı çeşitli CPU ve disk planlamasında kullanılır. Burada aynı anda CPU veya disk gerektiren birden fazla görevimiz var. İşlemci veya disk zamanı, bir sıra kullanılarak her görev için zamanlanır.
- Kuyruk, yazdırma işlerinin sayısının bir kuyruğa yerleştirildiği yazdırma kuyruğu için de kullanılabilir.
- Gerçek zamanlı sistemlerde kesintilerin işlenmesi, bir kuyruk veri yapısı kullanılarak yapılır. Kesintiler geldikleri sıraya göre ele alınır.
- Bir ağacın komşu düğümlerinin bir sonraki seviyeye geçmeden önce geçtiği kapsamlı arama, uygulama için bir kuyruk kullanır.
- Çağrı merkezi telefon sistemleri, servis temsilcileri tarafından cevaplanana kadar çağrıları bekletmek için kuyrukları kullanır.
Genel olarak, kuyruk veri yapısının, kaynakların veya öğelerin geldikleri sırayla, yani İlk Giren İlk Çıkar hizmet vermesini istediğimizde kullanıldığını söyleyebiliriz.
Sonuç
Kuyruk, çoğunlukla zamanlamanın gerekli olduğu kaynaklarda kullanılan bir FIFO (İlk Giren İlk Çıkar) veri yapısıdır. İki ucunda arka ve ön iki işaretçisi vardır ve bunlar sırasıyla bir öğe eklemek ve sıraya / kuyruğa bir öğe çıkarmak için kullanılır.
Bir sonraki eğitimimizde, öncelik kuyruğu ve döngüsel kuyruk gibi kuyruğun bazı uzantılarını öğreneceğiz.
=> Tam C ++ Öğreticiler listesini Keşfetmek İçin Buraya Bakın.
Önerilen Kaynaklar
- Çizim ile C ++ 'da Öncelik Sırası Veri Yapısı
- STL'de Öncelik Sırası
- Çizimle C ++ 'da Yığın Veri Yapısı
- Çizim ile C ++ 'da Dairesel Bağlantılı Liste Veri Yapısı
- Resimli C ++ 'da Bağlantılı Liste Veri Yapısı
- Çizim ile C ++ 'da Çift Bağlantılı Liste Veri Yapısı
- C ++ 'da Veri Yapılarına Giriş
- Kullanıcı Tanımlı Değişkenleri Kullanarak JMeter Veri Parametrelendirmesi