पायथन में कतार डेटा संरचना क्या है?



यह लेख आपको कई उदाहरणों के साथ पायथन में कतार डेटा संरचनाओं का विस्तृत और व्यापक ज्ञान प्रदान करेगा।

जैसा कि आपने पिछले लेख में डेटा स्ट्रक्चर्स के महत्व के बारे में पहले ही अध्ययन कर लिया है, आइए हम इस लेख के विषय यानी कतार डेटा संरचना के अधिकार में गोता लगाएँ। मैं निम्नलिखित विषयों पर चर्चा करूंगा:

कतार डेटा संरचना की आवश्यकता

मान लीजिए आप एक दिन किसी फिल्म के लिए चाहते हैं। मल्टीप्लेक्स में, टिकट पहले आओ-पहले-सेवा के आधार पर जारी किए गए थे और लोग एक दूसरे के पीछे खड़े होकर अपनी बारी का इंतजार कर रहे थे। तो आप क्या करेंगे?? आप पीछे गए होंगे और टिकट की प्रतीक्षा कर रहे अंतिम व्यक्ति के पीछे खड़े हो गए।





queue-data-structure

यहाँ, लोग एक के पीछे एक खड़े हैं और वे पर आधारित हैं पहला-पहला-पहला (FIFO) तंत्र। इस तरह की व्यवस्था को एक के रूप में जाना जाता है कतार।



कतार के दैनिक जीवन उदाहरण

आइए कुछ उदाहरणों पर विचार करें जहां हम दैनिक जीवन में काम करने वाले कतार प्रकार को देखते हैं:

  • फोन आंसरिंग सिस्टम- जो व्यक्ति आपके गैजेट पर पहले कॉल करता है, वह पहले भाग लेता है
  • सामान की जाँच करने वाली मशीन - सामान की जांच करता है जिसे पहले कन्वेयर बेल्ट पर रखा गया है।
  • टोल-टैक्स ब्रिज पर वाहन - पहले आने वाले वाहन पहले निकलते हैं।
  • कॉल सेंटर - फोन सिस्टम क्युस का उपयोग करेगा, जब तक कि एक सेवा प्रतिनिधि मुक्त नहीं होता है, तब तक उन्हें कॉल करने वाले लोगों को रखने के लिए।

इन सभी उदाहरणों का पालन करें पहला-इन-लास्ट-आउट रणनीति।

एक कतार डेटा संरचना बनाना

पूरक परिचालनों के अलावा, मैं कह सकता हूं कि क्यू पर मुख्य संचालन संभव हैं:



एक। एन-कतार या कतार के अंत में एक तत्व जोड़ें।

२। डे-कतार या कतार के सामने से एक तत्व को हटा दें

अब, पायथन में क्लास क्यू बनाने के माध्यम से शुरू करते हैं:

वर्ग कतार: __init __ (self, max_size): self .__ max_size = max_size self .__ तत्वों = [कोई नहीं] * स्व। _ max_size self .__ रियर = -1 स्वयं .__ सामने = 0।
  • अधिकतम आकार कतार में अपेक्षित तत्वों की अधिकतम संख्या है।
  • कतार के तत्व अजगर सूची में संग्रहीत हैं
  • रियर कतार में अंतिम तत्व की सूचकांक स्थिति को इंगित करता है।
  • पीछे शुरू में -1 होना चाहिए क्योंकि कतार खाली है
  • फ्रंट कतार में पहले तत्व की स्थिति को इंगित करता है।
  • फ्रंट को शुरुआत में 0 के रूप में लिया जाता है क्योंकि यह हमेशा कतार के पहले तत्व को इंगित करेगा

एनक्यू

अब, जब आप क्यू में तत्वों को संलग्न करने की कोशिश कर रहे हैं, तो आपको निम्नलिखित बिंदुओं को याद रखना होगा:

  • चाहे कतार में जगह बची हो या नहीं, यानि अगर पीछे से बराबर हो जाए तो max_size -1
  • रियर कतार में डाले गए अंतिम तत्व की ओर इशारा करेगा।

तो, एल्गोरिथ्म क्या होगा ??

#returns max_size of कतार डिफ get_max_size (सेल्फ): स्व वापस लौटें ।__ max_size #returns बूल वैल्यू चाहे कतार फुल हो या न हो, ट्रू फुल एंड फाल्स अन्यथा डिफ_फुल (सेल्फ): रिटर्न सेल्फ ।__ रियर == सेल्फ ।__ max_size-1 #। सम्मिलित करता है / कतार में डेटा संलग्न करता है यदि यह पूर्ण डीफ़ एनक्यू (स्वयं, डेटा) नहीं है: यदि (self.is_full ()): प्रिंट ('कतार पूर्ण नहीं है तो संभव नहीं है') बाकी: self____ रियर + = 1 सेल्फ। __elements [self .__ रियर] = डेटा #display कतार की सभी सामग्री डिस्प्ले डिस्प्ले (स्व): i for रेंज में (0, स्व .__ रियर + 1): प्रिंट (स्वयं .__ तत्व [i]) # आप का उपयोग कर सकते हैं। नीचे __str __ () डीएस ऑब्जेक्ट के तत्वों को प्रिंट करने के लिए डीबगिंग करते समय __str __ (स्व): संदेश = [] इंडेक्स = स्व .__ सामने जबकि (इंडेक्स)<=self.__rear): msg.append((str)(self.__elements[index])) index+=1 msg=' '.join(msg) msg='Queue data(Front to Rear): '+msg return msg

अब, जब आप निम्नलिखित कार्य करते हैं:

कतार 1 = कतार (5)

# सभी आवश्यक तत्व जमा करें।

queue1.enqueue ('ए')

queue1.enqueue ('बी')

queue1.enqueue ('C')

queue1.enqueue ('D')

queue1.enqueue ('ई')

queue1.display ()

queue1.enqueue ('एफ')

प्रिंट (कतार 1)

आउटपुट:

सेवा मेरे

बी

सी

जावा में विधि अधिभार के लाभ

डी

है

कतार भरी है। संभव नहीं है

कतार डेटा (फ्रंट टू रियर): ए बी सी डी ई

डे-क्यू

अब, जब आपने तत्वों को कतार में सम्मिलित / संलग्न किया है, तो आप उन्हें सामने से हटाना / हटाना चाहते हैं, इसलिए आपको निम्नलिखित बातों का ध्यान रखना चाहिए:

  • कतार में ऐसे तत्व हैं यानी रियर -1 के बराबर नहीं होना चाहिए।
  • दूसरे, आपको यह याद रखने की जरूरत है कि चूंकि तत्वों को सामने से हटा दिया जाता है, इसलिए सामने हटाने के बाद अगले मोर्चे को इंगित करने के लिए बढ़ा दिया जाना चाहिए।
  • सामने वाले को कतार के अंत की ओर इशारा नहीं करना चाहिए यानी अधिकतम_साइज के बराबर।

तो, एल्गोरिथ्म क्या होगा ??

# जाँच करने के लिए कि क्या कतार खाली है या नहीं def is_empty (स्व): if (स्व .__ रियर == - 1 या स्व। _ सामने == स्व। _ अधिकतम_साइज़): वापस लौटें सत्य: किसी तत्व को हटाने के लिए गलत #function पर वापस लौटें। यह dequeue (self) को परिभाषित करता है: if (self.is_empty ()): print ('कतार पहले से ही खाली है') और: data = self .__ elements [self .__ front] self .__ सामने + = 1 रिटर्न डेटा #function तत्वों से प्रदर्शित करने के लिए। आगे पीछे अगर कतार खाली डिस डिस्प्ले (सेल्फ) नहीं है: अगर (नहीं self.is_empty ()): i के लिए रेंज में (स्व। _ सामने, स्व .__ रियर + 1): प्रिंट (स्व। लि। तत्व [i]) : प्रिंट ('खाली कतार')

अब जब आप निम्नलिखित कार्य करते हैं:

कतार 1 = कतार (5)

# सभी आवश्यक तत्व जमा करें

queue1.enqueue ('ए')

queue1.enqueue ('बी')

queue1.enqueue ('C')

queue1.enqueue ('D')

queue1.enqueue ('ई')

प्रिंट (कतार 1)

# आवश्यक सभी तत्वों को जमा करें

प्रिंट ('हटाए गए:', queue1.dequeue ())

प्रिंट ('हटाए गए:', queue1.dequeue ())

प्रिंट ('हटाए गए:', queue1.dequeue ())

प्रिंट ('हटाए गए:', queue1.dequeue ())

प्रिंट ('हटाए गए:', queue1.dequeue ())

प्रिंट ('हटाए गए:', queue1.dequeue ())

# कतार में सभी तत्वों को हटा दें।

queue1.display ()

आउटपुट:

कतार डेटा (फ्रंट टू रियर): ए बी सी डी ई

समाप्त: ए

समाप्त: B

हटा दिया गया: सी

समाप्त: डी

समाप्त: ई

कतार पहले से खाली है

समाप्त: कोई नहीं

खाली कतार

कतार के अनुप्रयोग

अब तक, आप कतार की मूल बातें समझ चुके हैं। अब गहराई से गोता लगाने के लिए हम इसके कुछ अनुप्रयोगों पर ध्यान देंगे।

छँटाई समारोह c ++
  • उदाहरण 1:

विंडोज में कतार प्रिंट करें सभी सक्रिय और लंबित प्रिंट नौकरियों को संग्रहीत करने के लिए एक कतार का उपयोग करता है। जब हम दस्तावेजों को प्रिंट करना चाहते हैं, तो हम एक के बाद एक प्रिंट कमांड जारी करते हैं। प्रिंट कमांड के आधार पर, दस्तावेज़ प्रिंट कतार में पंक्तिबद्ध हो जाएंगे। जब प्रिंटर तैयार हो जाता है, तो इसे प्रिंट करने के लिए दस्तावेज़ को पहले आउट ऑर्डर में भेजा जाएगा।

मान लीजिए कि आपने आदेश doc1 में 3 दस्तावेजों के लिए प्रिंट कमांड जारी किए हैं, उसके बाद doc2 और doc3।
प्रिंट कतार नीचे दिखाए गए अनुसार पॉपुलेटेड होगी:

doc-n, जहाँ दस्तावेज़ मुद्रण और n के लिए भेजा गया दस्तावेज़ है, दस्तावेज़ में पृष्ठों की संख्या है। उदाहरण के लिए, doc2-10 का मतलब है कि doc2 मुद्रित किया जाना है और इसमें 10 पृष्ठ हैं। यहां एक कोड है जो प्रिंट कतार संचालन का अनुकरण करता है। कोड के माध्यम से जाएं और देखें कि इस कार्यान्वयन में कतार का उपयोग कैसे किया जाता है।

वर्ग कतार: def __init __ (स्व, मैक्स_साइज़): स्वयं .__ अधिकतम_साइज़ = स्वयं को .__ तत्व = [कोई भी] * स्व:। अधिकतम स्व का उपयोग करें .__ रियर = -1 स्व। _ सामने = 0 डिफ़ेंस is_full (स्व): if (सेल्फ रियर। _) = self .__ max_size-1): रिटर्न ट्रू रिटर्न गलत डिफेंस is_empty (सेल्फ): अगर (सेल्फ। फ्रंट> सेल्फ। स्व रियर): रिटर्न ट्रू रिटर्न फाल्स डि एनक्यू (सेल्फ, डेटा): if (self .is_full ()): प्रिंट ('कतार पूर्ण है !!!') बाकी: स्वयं .__ रियर + = 1 स्वयं .__ तत्व [स्वयं .__ रियर] = डेटा डिफ्यू (सेल्फ): अगर (स्व .is_empty ()): प्रिंट ('कतार खाली है)! !! ') और: डेटा = स्व .__ तत्व [स्व। _ सामने] स्व। _ सामने + = 1 रिटर्न डेटा डिफ डिस्प्ले (स्व): सीमा में सूचकांक के लिए (स्व। सामने, स्व। _ रियर + 1): प्रिंट (स्व। लि। तत्व) [index]) def get_max_size (स्व): स्व वापस लौटें ।__ max_size # आप डीएस ऑब्जेक्ट के तत्वों को प्रिंट करने के लिए नीचे __str __ () का उपयोग कर सकते हैं जबकि #debugging def __str __ (स्व): msg = [] index = self__ स्व सामने। (सूचकांक<=self.__rear): msg.append((str)(self.__elements[index])) index+=1 msg=' '.join(msg) msg='Queue data(Front to Rear): '+msg return msg #function that enqueue are the documents to be printed in Queue named print_queue def send_for_print(doc): global print_queue if(print_queue.is_full()): print('Queue is full') else: print_queue.enqueue(doc) print(doc,'sent for printing') #function that prints the document if number of pages of document is less than #total number of pages in printer def start_printing(): global print_queue while(not print_queue.is_empty()): #here we dequeue the Queue and take the coument that was input first for printing. doc=print_queue.dequeue() global pages_in_printer #the aim of this for loop is to find number of pages of the of document which is doc name followed by “-“ for i in range(0,len(doc)): if(doc[i]=='-'): no_of_pages=int(doc[i+1:]) break if(no_of_pages<=pages_in_printer): print(doc,'printed') pages_in_printer-=no_of_pages print('Remaining no. of pages in printer:', pages_in_printer) else: print('Couldn't print',doc[:i],'. Not enough pages in the printer.') pages_in_printer=12 print_queue=Queue(10) send_for_print('doc1-5') send_for_print('doc2-3') send_for_print('doc3-6') start_printing()

आउटपुट:

doc1-5 को मुद्रण के लिए भेजा गया

doc2-3 को मुद्रण के लिए भेजा गया

doc3-6 मुद्रण के लिए भेजा

doc1-5 मुद्रित

शेष रहे। प्रिंटर में पृष्ठों की संख्या: 7

doc2-3 मुद्रित

शेष रहे। प्रिंटर में पृष्ठों की संख्या: 4

Doc3 प्रिंट नहीं कर सकता है। प्रिंटर में पर्याप्त पृष्ठ नहीं हैं

  • उदाहरण 2:

आइए एक और उदाहरण को समझने की कोशिश करें जो कतार डेटा संरचना का उपयोग करता है। क्या आप कोड को समझने और यह बताने की कोशिश कर सकते हैं कि निम्नलिखित फ़ंक्शन क्या करता है?

  1. def मज़ा (n):
  2. aqueue = कतार (100)
  3. श्रेणी में संख्या के लिए (1, n + 1):
  4. एनक्यू (संख्या)
  5. परिणाम = १
  6. जबकि (नहीं (aqueue.is_empty ()):
  7. संख्या = AQUUE.DEQUEUE ()
  8. परिणाम * = संख्या
  9. प्रिंट (परिणाम)

जब फंक्शन फन () एन पास करके मंगाया जाता है,

  • 1 से n तक तत्वों को 2 से 4 एन-कतारों में पंक्तिबद्ध करता है
  • लाइनों 5 से 8 उन तत्वों के उत्पाद को एक-एक करके डी-कतारबद्ध करके ढूंढता है

इसके साथ, हम इस कतार डेटा संरचना लेख के अंत में आते हैं। यदि आप सफलतापूर्वक समझ गए हैं और अपने आप से कोड चला रहे हैं तो आप कतार डेटा संरचना के लिए एक नौसिखिया नहीं हैं।

क्या आप हमसे कोई प्रश्न पूछना चाहते हैं? कृपया इस लेख के टिप्पणी अनुभाग में इसका उल्लेख करें और हम जल्द से जल्द आपके पास वापस आ जाएंगे।

अपने विभिन्न अनुप्रयोगों के साथ अजगर पर गहराई से ज्ञान प्राप्त करने के लिए, आप लाइव के लिए नामांकन कर सकते हैं 24/7 समर्थन और आजीवन पहुंच के साथ।