c ++ deque बनाम कतार बनाम स्टैक


82

कतार और ढेर व्यापक रूप से उल्लिखित एक संरचना है। हालाँकि, C ++ में, कतार के लिए आप इसे दो तरीकों से कर सकते हैं:

#include <queue>
#include <deque>

लेकिन स्टैक के लिए आप इसे केवल इस तरह से कर सकते हैं

#include <stack>

मेरा सवाल है, कतार और छल में क्या अंतर है, दो संरचनाओं का प्रस्ताव क्यों? स्टैक के लिए, किसी अन्य संरचना को शामिल किया जा सकता है?

जवाबों:


78

मोरोन / आर्यभट्ट सही है, लेकिन थोड़ा और विस्तार सहायक हो सकता है।

कतार और स्टैक उच्च स्तर के कंटेनरों की तुलना में डेक्स, वेक्टर, या सूची में हैं। इसके द्वारा, मेरा मतलब है कि आप निचले स्तर के कंटेनरों से एक कतार या स्टैक बना सकते हैं।

उदाहरण के लिए:

  std::stack<int, std::deque<int> > s;
  std::queue<double, std::list<double> > q;

अंतर्निहित कंटेनर के रूप में एक deque का उपयोग करके एक स्टैक का निर्माण करेंगे और अंतर्निहित कंटेनर के रूप में एक सूची का उपयोग करके डबल्स की एक कतार।

आप sएक प्रतिबंधित डीके के qरूप में और एक प्रतिबंधित सूची के रूप में सोच सकते हैं ।

यह आवश्यक है कि निचले स्तर के कंटेनर उच्च स्तर के कंटेनर द्वारा आवश्यक तरीकों को लागू करें। ये हैं back(), push_back()और pop_back()ढेर के लिए और front(), back(), push_back(), और pop_front()कतार के लिए।

अधिक विस्तार के लिए स्टैक और कतार देखें ।

छल के संबंध में, यह एक कतार से बहुत अधिक है जहाँ आप दोनों सिरों को सम्मिलित कर सकते हैं। विशेष रूप से, इसमें यादृच्छिक पहुंच है operator[]। यह इसे एक वेक्टर की तरह बनाता है, लेकिन एक वेक्टर जहां आप सम्मिलित कर सकते हैं और शुरुआत में इसे हटा सकते हैं push_front()और pop_front()

देखें Deque विस्तार के लिए।


16
stackऔर queue सिर्फ deque अपनी पूरी सुविधा से प्रतिबंधित है।
बोब्बोबो

59

Queue: आप केवल एक छोर में सम्मिलित कर सकते हैं और दूसरे से निकाल सकते हैं।

Deque: आप दोनों सिरों को सम्मिलित और हटा सकते हैं।

तो एक का उपयोग कर Deque, आप एक के Queueरूप में अच्छी तरह से मॉडल कर सकते हैंStack

संकेत:
Deque" D ouble e nded que ue" के लिए छोटा है।


4
यदि आप स्टैक मॉडल करने के लिए डेक्स का उपयोग करते हैं तो क्या यह ओवरकिल नहीं होगा?
21

आप एक कतार के साथ एक स्टैक मॉडल नहीं कर सकते।
आर सैमुअल क्लैचको

1
बहुत अधिक अंतर हैं। queueएक कंटेनर की आवश्यकताओं को पूरा नहीं करता है। स्वर्ग की खातिर इसका कोई पुनरावृत्त नहीं है!
पोटाटोसवेटर

सभी मानक पुस्तकालय कंटेनरों के @skydoor, deque यकीनन सबसे कम ओवरहेड वाले हैं।

3
@skydoor: एक FYI के रूप में, STL डिफ़ॉल्ट रूप से बैकिंग कंटेनर के रूप में std::stackउपयोग करता है std::deque। मैं यहां कारण पर अटकलें लगाता हूं: stackoverflow.com/questions/102459/… (मूल रूप से जो एक dequeसे कम ओवरहेड बढ़ रहा है )।
माइकल बूर

33

dequeएक कंटेनर टेम्पलेट है। यह यादृच्छिक-पहुँच पुनरावृत्तियों के साथ अनुक्रम के लिए आवश्यकताओं को संतुष्ट करता है, बहुत कुछ vector

queueएक कंटेनर बिल्कुल नहीं है, यह एक एडाप्टर है । इसमें एक कंटेनर होता है और एक अलग, अधिक विशिष्ट इंटरफ़ेस प्रदान करता है। का प्रयोग करें queueआप याद करने के लिए (या याद दिलाना) के अलावा आपरेशन से बचना चाहते हैं जब push[_back]और pop[_front], frontऔर back, sizeऔर empty। आप queueपहले और अंतिम के अलावा अंदर के तत्वों को बिल्कुल भी नहीं देख सकते हैं !


7
एडाप्टर - दूसरे शब्दों में अनावश्यक कार्यक्षमता क्रिप्लर , लेकिन एडॉप्टर सिर्फ ठीक है
बॉबोबोबो

22

सी ++ पुस्तकालय में, दोनों std::stackऔर std::queueकंटेनर के रूप में लागू किया जाता है एडेप्टर । इसका मतलब है कि वे क्रमशः एक स्टैक या एक कतार का इंटरफ़ेस प्रदान करते हैं, लेकिन न तो वास्तव में अपने आप में एक कंटेनर है। इसके बजाय, वे कुछ अन्य कंटेनर का उपयोग करते हैं (उदाहरण के लिए std::dequeया std::listवास्तव में डेटा को संग्रहीत करने के लिए), और std::stackकक्षा में अनुवाद करने pushऔर popकरने के लिए कोड का एक छोटा सा हिस्सा है, push_backऔर pop_back(और std::queueलगभग समान है, लेकिन उपयोग करके push_backऔर pop_front)।


एक के लिए queue, वी.एस. भी मैप करने के लिए लगता है popके लिए pop_front, और pushकरने के लिए push_backतो मुझे लगता है कि इस कार्यान्वयन निर्भर है,।
चापजेक

@ अचलप्पेक: नहींं - फिर से जाँच, बस मेरी याददाश्त बंद थी। pop_frontऔर push_backक्या आवश्यक है। मैं क्षमाप्रार्थी हूं।
जेरी कॉफिन

7

एक डैक एक डबल-एंडेड कतार है, जो दोनों ओर से आसान सम्मिलन / निष्कासन की अनुमति देता है। कतारें केवल एक छोर में सम्मिलन और दूसरे से पुनः प्राप्ति की अनुमति देती हैं।


5

deque बैक / फ्रंट से इन्सर्ट / पॉप का समर्थन करता है

कतार केवल पीछे से डालने का समर्थन करती है, और सामने से पॉप। तुम्हें पता है, एक फीफो (पहली बार में बाहर)।



0

प्राथमिकता कतार घटाव कुछ आदेश (प्राथमिकता) के अनुसार होता है, जो कि एन्क्यू आदेश नहीं होता है।

उदाहरण के लिए, आप समयबद्ध घटनाओं को स्टोर कर सकते हैं जहाँ आप सबसे पहले की घटना को बाहर निकालना चाहते हैं और उसके निर्धारित समय के लिए क्वेरी कर सकते हैं ताकि आप उस समय तक सो सकें।

प्रायोरिटी का उपयोग करके प्रायोरिटी कतारों को लागू किया जाता है।

माइक एंडरसन द्वारा यहाँ:
https://www.quora.com/What-is-the-difference-between-a-priority-queue-and-a-queue


0

डैक (डबल एंडेड कतार) में तत्व को पीछे से डाला जा सकता है और फॉर्म को वापस (समान के रूप में) हटाया जा सकता है, लेकिन कतार में केवल सामने से हटा सकते हैं।


यह उत्तर विषय में कुछ भी नया नहीं जोड़ता है (और अधिकांश उत्तर 2010 के हैं)
बार्बसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.