c circular queue data structure
C ++ सर्कुलर कतार डेटा संरचना पर यह ट्यूटोरियल बताता है कि परिपत्र कतार क्या है, कार्यान्वयन और अनुप्रयोगों के साथ मूल संचालन क्या हैं:
एक परिपत्र कतार उस मूल कतार का विस्तार है, जिस पर हमने पहले चर्चा की है। इसे 'रिंग बफर' के रूप में भी जाना जाता है।
C ++ में Circular Queue क्या है?
एक परिपत्र कतार एक रैखिक डेटा संरचना है जिसका उपयोग डेटा आइटम को संग्रहीत करने के लिए किया जाता है। यह FIFO (फर्स्ट इन, फर्स्ट आउट) दृष्टिकोण का पालन करके संचालन करता है और कतार में अंतिम स्थिति सर्कल बनाने के लिए पहली स्थिति में वापस जुड़ा हुआ है।
=> संपूर्ण सी ++ प्रशिक्षण श्रृंखला यहां देखें
आप क्या सीखेंगे:
सी ++ में परिपत्र कतार
निम्नलिखित आरेख एक परिपत्र कतार दिखाता है।
उपरोक्त छवि 10. आकार की एक गोलाकार डेटा संरचना दिखाती है। पहले छह तत्व पहले से ही कतार में हैं और हम देखते हैं कि पहली स्थिति और अंतिम स्थिति शामिल हो गई है। इस व्यवस्था के कारण, अंतरिक्ष एक व्यर्थ कतार में होने के कारण व्यर्थ नहीं जाता है।
अनुभवी के लिए sql सर्वर प्रश्न और उत्तर
कतार भरी होने के बाद एक रैखिक कतार में, हम तत्वों को दूसरे छोर से हटाते हैं, और कतार की स्थिति को अभी भी पूर्ण के रूप में दिखाया गया है और हम अधिक तत्व नहीं डाल सकते हैं।
परिपत्र कतार में, जब कतार भरी होती है, और जब हम अंतिम और पहली स्थिति से जुड़े तत्वों को सामने से हटाते हैं, तो हम उन तत्वों को पीछे से सम्मिलित कर सकते हैं जिन्हें तत्व हटाकर खाली किया गया था।
अगले भाग में, हम गोलाकार कतार के मूल संचालन के बारे में जानेंगे।
बुनियादी संचालन
परिपत्र कतार के कुछ बुनियादी संचालन निम्नानुसार हैं:
सामने: परिपत्र कतार में सामने की स्थिति को लौटाता है।
रियर: परिपत्र कतार में पीछे की स्थिति देता है।
एन्क्यू: एन्क्यू (मान) का उपयोग परिपत्र कतार में एक तत्व डालने के लिए किया जाता है। तत्व हमेशा कतार के पीछे के अंत में डाला जाता है।
हम परिपत्र कतार में एक नया तत्व सम्मिलित करने के लिए चरणों के निम्नलिखित अनुक्रम का पालन करते हैं।
# 1) यह देखें कि क्या परिपत्र कतार पूर्ण है: परीक्षण ((पीछे == SIZE-1 && सामने == 0) (रियर == फ्रंट -1)), जहां E SIZE ’वृत्ताकार कतार का आकार है।
#दो) यदि परिपत्र कतार पूर्ण है, तो यह 'कतार पूर्ण है' के रूप में एक संदेश प्रदर्शित करता है। यदि कतार पूर्ण नहीं है, तो जांचें कि क्या (पीछे == SIZE - 1 && सामने! = 0)। अगर यह सही है तो रियर = 0 सेट करें और एलिमेंट डालें।
घटाव: Dequeue फ़ंक्शन का उपयोग कतार से एक तत्व को हटाने के लिए किया जाता है। परिपत्र कतार में, तत्व हमेशा सामने के छोर से हटा दिया जाता है। नीचे दिए गए एक परिपत्र कतार में dequeue संचालन के लिए अनुक्रम है।
कदम:
# 1) जांचें कि क्या परिपत्र कतार खाली है: जांचें कि क्या (सामने == - 1)।
#दो) यदि यह खाली है तो संदेश प्रदर्शित करें 'कतार खाली है'। यदि कतार खाली नहीं है तो चरण 3 का प्रदर्शन करें।
दोगुनी लिंक की गई सूची c ++
# 3) जांचें कि क्या (सामने == रियर)। यदि यह सत्य है तो फ्रंट = रियर = -1 और सेट करें अगर (सामने == आकार -1) की जाँच करें, यदि यह सत्य है तो सामने = 0 सेट करें और तत्व वापस करें।
चित्रण
इस खंड में, हम परिपत्र कतार में तत्वों को जोड़ने / निकालने के एक विस्तृत चित्रण के माध्यम से जाएंगे।
नीचे दिखाए गए अनुसार 5 तत्वों की निम्नलिखित परिपत्र कतार पर विचार करें:
अगला, हम पंक्ति 1 में आइटम सम्मिलित करते हैं।
अगला, हम मान 3 के साथ एक आइटम सम्मिलित करते हैं।
जब हम एक कतार को पूर्ण बनाने के लिए तत्वों को सम्मिलित करते हैं, तो प्रतिनिधित्व नीचे दिखाया जाएगा।
अब हम नीचे दिखाए गए अनुसार दो तत्वों यानि आइटम 1 और आइटम 3 को कतार से हटाते हैं।
अगला, हम नीचे दर्शाए अनुसार गोलाकार कतार में 11 तत्व सम्मिलित करते हैं।
फिर से हम परिपत्र कतार में तत्व 13 डालें। नीचे दिखाए गए अनुसार कतार दिखाई देगी।
हम देखते हैं कि गोलाकार कतार में हम एक सर्कल में तत्वों को स्थानांतरित या सम्मिलित करते हैं। इसलिए हम कतार के पूरे स्थान का उपभोग तब तक कर सकते हैं जब तक कि यह पूर्ण न हो जाए।
कार्यान्वयन
C ++ का उपयोग करके परिपत्र कतार को लागू करें।
#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< ऊपर दिखाया गया है कि परिपत्र कतार संचालन का आउटपुट है। सबसे पहले, हम तत्वों को जोड़ते हैं और फिर दो तत्वों को हटाते हैं या हटाते हैं। इसके बाद, हम तीन और तत्वों को गोलाकार कतार में सम्मिलित करते हैं। हम देखते हैं कि रैखिक कतार के विपरीत, तत्वों को कतार के अंत में जोड़ा जाता है।
लिंक्ड सूची कार्यान्वयन
आइए अब एक वृत्ताकार कतार की लिंक्ड सूची कार्यान्वयन पर चर्चा करें। नीचे दिए गए C ++ में परिपत्र कतार की लिंक की गई सूची का कार्यान्वयन है। ध्यान दें कि हम प्रत्येक नोड का प्रतिनिधित्व करने के लिए संरचना का उपयोग करते हैं। संचालन वही हैं जो पहले चर्चा में थे सिवाय इसके कि इस मामले में, हमें उन्हें लिंक किए गए सूची नोड्स के संबंध में प्रदर्शन करना होगा।
आउटपुट एन्क्यू ऑपरेशन के बाद परिपत्र कतार को दिखाता है, dequeue और दूसरी एन्क्यू ऑपरेशन के बाद भी।
#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: '< आउटपुट:

अगला कार्यान्वयन लिंक की गई सूची का उपयोग करके परिपत्र कतार प्रदर्शित करने के लिए जावा प्रोग्राम है।
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); } }
आउटपुट:

उपरोक्त कार्यक्रम का उत्पादन पिछले कार्यक्रम के समान है।
अनुप्रयोग
परिपत्र कतार के कुछ अनुप्रयोगों पर चर्चा करते हैं।
- CPU निर्धारण: ऑपरेटिंग सिस्टम प्रक्रिया जिसमें निष्पादन के लिए कुछ घटनाओं की आवश्यकता होती है या कुछ अन्य प्रक्रियाओं को पूरा करने के लिए अक्सर एक परिपत्र कतार में बनाए रखा जाता है ताकि वे एक के बाद एक निष्पादित हों जब सभी शर्तें पूरी होती हैं या जब सभी घटनाएं होती हैं।
- स्मृति प्रबंधन: साधारण कतारों का उपयोग स्मृति अंतरिक्ष को बर्बाद करता है जैसा कि हमारे उपरोक्त चर्चा में पहले ही उल्लेख किया गया है। स्मृति प्रबंधन के लिए एक परिपत्र कतार का उपयोग करना इष्टतम स्मृति उपयोग के लिए फायदेमंद है।
- कंप्यूटर नियंत्रित ट्रैफिक सिग्नल सिस्टम: कम्प्यूटरीकृत ट्रैफिक सिग्नल को अक्सर एक परिपत्र कतार में जोड़ा जाता है ताकि वे निर्दिष्ट समय अंतराल के बाद खुद को दोहराएं।
निष्कर्ष
परिपत्र कतारें एक सामान्य कतार के प्रमुख नुकसान को ठीक करती हैं जिसमें हम तत्वों को सम्मिलित नहीं कर सकते हैं जब रियर पॉइंटर कतार के अंत में होता है तब भी जब हम तत्वों और अंतरिक्ष को हटाते हैं। एक परिपत्र कतार में, तत्वों को एक परिपत्र फैशन में व्यवस्थित किया जाता है, ताकि अंतरिक्ष बिल्कुल भी बर्बाद न हो।
हमने वृत्ताकार कतार के प्रमुख संचालन भी देखे हैं। सर्कुलर कतारें शेड्यूलिंग उद्देश्यों और ट्रैफ़िक सिग्नल सिस्टम जैसे अनुप्रयोगों के लिए उपयोगी होती हैं जहाँ सिग्नल मुड़ते हैं।
सबसे अच्छा यूट्यूब वीडियो डाउनलोडर क्या है
हमारे अगले ट्यूटोरियल में, हम डबल-एंडेड कतारों के बारे में जानेंगे, जिन्हें बस 'deque' कहा जाता है।
=> स्क्रैच से C ++ जानने के लिए यहाँ जाएँ
अनुशंसित पाठ
- कतार डेटा संरचना चित्रण के साथ C ++ में
- चित्रण के साथ C ++ में प्राथमिकता कतार डेटा संरचना
- चित्रण के साथ C ++ में परिपत्र लिंक्ड सूची डेटा संरचना
- डेटा मार्ट ट्यूटोरियल - डेटा मार्ट के प्रकार, उदाहरण और कार्यान्वयन
- चित्रण के साथ C ++ में स्टैक डेटा संरचना
- डेटा माइनिंग उदाहरण: डेटा माइनिंग 2021 के अधिकांश सामान्य अनुप्रयोग
- सी ++ में बाइनरी ट्री डेटा संरचना
- एसटीएल में प्राथमिकता कतार