2010-01-15 51 views
26

मैं सरणी/सूचियों के बजाय स्टैक या कतार डेटा संरचनाओं का उपयोग कब और कब करूँ? क्या आप किसी राज्य के लिए एक उदाहरण दिखा सकते हैं कि यदि आप स्टैक या कतार का उपयोग करेंगे तो यह बेहतर होगा?ढेर और कतार, क्यों?

+6

स्टैक्स और कतारों को सरणी और सूचियों के साथ कार्यान्वित किया जाता है। – Yada

+0

आप डेटा संरचनाओं पर एक पाठ से परामर्श करना चाहेंगे। यह आमतौर पर सभी सीएस और डीपी छात्रों के लिए एक बुनियादी आवश्यकता है। –

उत्तर

32

क्योंकि वे आपके डेटा को सरणी और सूचियों की तुलना में किसी विशेष तरीके से प्रबंधित करने में सहायता करते हैं।

कतार में पहली बार बाहर (फीफो)

ढेर बाहर में पिछले है, पहले (LIFO)

Arrays और सूचियों रैंडम एक्सेस कर रहे हैं, पहले। वे बहुत लचीले और आसानी से भ्रष्ट हैं। यदि आप अपने डेटा को फीफो या लिफ़ो के रूप में प्रबंधित करना चाहते हैं तो उन लोगों का उपयोग करना सबसे अच्छा है, पहले ही कार्यान्वित, संग्रह।

+5

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

+1

@ पोर्कुलस: पर्यावरण पर निर्भर करता है। .NET में जेनेरिक सूची <> संग्रह और 1.0 से एक ऐरेलिस्ट क्लास है जो [] ऑपरेटर के माध्यम से यादृच्छिक पहुंच की अनुमति देता है। लिंक्ड सूची कार्यान्वयन विशेष रूप से लिंक्डलिस्ट –

+0

नाम दिया गया है, मैं कहूंगा कि सरल इंटरफेस उनके कार्यान्वयन को अधिक अक्षांश देते हैं। और हमेशा क्लासिक खोज उदाहरण होता है, जहां गहराई पहले एक स्टैक के लिए कतार को प्रतिस्थापित करके पहली बार चौड़ाई बन जाती है, और फिर प्राथमिकता कतार के साथ अलग होती है। – wowest

8

जब आप अपनी डेटा संरचना पर एक निश्चित उपयोग पैटर्न को लागू करना चाहते हैं। इसका अर्थ यह है कि जब आप किसी समस्या को डीबग कर रहे हैं, तो आपको आश्चर्य नहीं होगा कि किसी ने आपकी सूची के बीच में एक तत्व को यादृच्छिक रूप से डाला है, कुछ आविष्कारों को गड़बड़ कर रहा है।

11
  1. एक कतार का उपयोग करें जब आप क्रम में बातें बाहर निकलने के लिए है कि आप उन्हें में डाल करना चाहते हैं।
  2. एक ढेर का उपयोग करें जब आप विपरीत क्रम से आप उन्हें में डाल में चीजों को बाहर करना चाहते हैं।
  3. जब आप उन्हें कुछ भी प्राप्त करना चाहते हैं, तो किसी सूची का उपयोग करें, भले ही आप उन्हें कब रखें (और जब आप उन्हें स्वचालित रूप से निकालना नहीं चाहते हैं)।
3

यह इरादा का विषय है। ढेर और कतारों को अक्सर सरणी और सूचियों का उपयोग करके कार्यान्वित किया जाता है, लेकिन तत्वों को जोड़ने और हटाने को अधिक सख्ती से परिभाषित किया जाता है।

1

एक ढेर या कतार एक तार्किक डेटा संरचना है; इसे भौतिक संरचना (उदा। सूची, सरणी, पेड़, आदि) के साथ कवर के तहत लागू किया जाएगा

यदि आप चाहें तो "अपना खुद का रोल करें" में आपका स्वागत है, या पहले से कार्यान्वित अमूर्तता का लाभ उठाएं।

3

दूसरों के पहले से ही उपयोग किए जाने वाले उपयोग प्रवर्तन के अलावा, प्रदर्शन प्रदर्शन भी है। जब आप किसी सरणी या सूची (ArrayList) की शुरुआत से कुछ हटाना चाहते हैं तो यह आमतौर पर ओ (एन) समय लेता है, लेकिन कतार के लिए यह O (1) समय लेता है। यदि बहुत सारे तत्व हैं तो इससे बड़ा अंतर हो सकता है।

0

प्रश्न संदिग्ध है, क्योंकि आप किसी सरणी या लिंक किए गए डेटा संरचना का उपयोग करके स्टैक या कतार के सार डेटा प्रकार का प्रतिनिधित्व कर सकते हैं।

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

एक लिंक किए गए कतार/लिंक किए गए ढेर में उचित कार्यान्वयन के साथ लचीला, उच्च गति सम्मिलन/हटाना है, लेकिन किसी सरणी से अधिक संग्रहण की आवश्यकता है। प्रविष्टि/हटाना एक सरणी के सिरों पर सस्ती हैं जब तक आप अंतरिक्ष से बाहर नहीं जाते; एक कतार या ढेर के एक सरणी कार्यान्वयन के लिए आकार बदलने के लिए और अधिक काम की आवश्यकता होगी, क्योंकि आपको मूल को एक बड़ी संरचना में कॉपी करने की आवश्यकता होगी (या ओवरफ़्लो त्रुटि के साथ विफल)।

4

Arrays/सूचियां और ढेर/कतार पारस्परिक रूप से अनन्य अवधारणाएं नहीं हैं। असल में किसी भी स्टैक या कतार कार्यान्वयन को आप निश्चित रूप से हुड के नीचे या तो सरणी या सूचियों का उपयोग कर रहे हैं।

ऐरे और सूची संरचनाएं डेटा संग्रहित करने के बारे में एक विवरण प्रदान करती हैं, संरचनाओं पर मौलिक संचालन की जटिलता की गारंटी के साथ लंबे समय तक।

ढेर और कतार एक उच्च स्तर का विवरण देते हैं कि तत्वों को कैसे डाला या हटाया जाता है। कतारों के लिए फीफो, ढेर के लिए फिलो।

उदाहरण के लिए। यदि आप एक संदेश कतार लागू कर रहे हैं, तो आप एक कतार का उपयोग करेंगे। लेकिन कतार स्वयं प्रत्येक संदेश को एक सूची में स्टोर कर सकती है। सूची के मोर्चे पर एक संदेश जोड़कर "पुशिंग", सूची के अंत से एक संदेश "पॉपिंग" कर रहा है।

1

ढेर और कतार एक संग्रह को संभालने के लिए और अधिक उन्नत तरीके हैं जो सरणी स्वयं संग्रह करती है, जो संग्रह के अंदर तत्वों के व्यवहार के तरीके में कोई ऑर्डर स्थापित नहीं करती है।

स्टैक (एलआईएफओ - पहले में अंतिम) और एक कतार (फीफो - फर्स्ट इन फर्स्ट आउट) स्थापित करें और ऑर्डर करें जिसमें आपके तत्वों को संग्रह से हटाया गया है और हटा दिया गया है।

आप स्टैक या कतार पैटर्न को लागू करने के लिए स्टोरेज संरचना के रूप में एक ऐरे या लिंक्ड सूची का उपयोग कर सकते हैं। या यहां तक ​​कि उन बुनियादी संरचनाओं द्विआधारी पेड़ या प्राथमिकता कतारों की तरह अधिक जटिल पैटर्न है, जो भी प्रविष्टि और तत्वों को हटाने में न केवल एक आदेश पर भी संग्रह के अंदर उन्हें छँटाई लाने सकता है के साथ पैदा करते हैं।

33

आप एक कैफेटेरिया गए हैं, है ना? और प्लेटों का एक ढेर देखा? जब ढेर में एक साफ प्लेट जोड़ा जाता है, तो इसे शीर्ष पर रखा जाता है। जब एक प्लेट हटा दी जाती है, तो इसे शीर्ष से हटा दिया जाता है। इसलिए इसे लास्ट-इन-फर्स्ट-आउट (एलआईएफओ) कहा जाता है। एक कंप्यूटर स्टैक उस तरह है, सिवाय इसके कि इसमें संख्याएं हैं, और यदि आप चाहें तो आप एक सरणी या सूची में से एक बना सकते हैं। (प्लेटों के ढेर एक वसंत के नीचे है, तो वे आप कहते हैं कि "धक्का" शीर्ष पर एक, और आप इसे "पॉप" बंद जब आप एक को हटा दें। वहीं उन शब्दों से आते है।)

कैफेटेरिया में, वापस जाओ, जहां वे व्यंजन धोते हैं। वे एक कन्वेयर बेल्ट, जहां वे प्लेटों डाल एक छोर में धोया जा करने के लिए है, और वे एक ही क्रम में दूसरे छोर बाहर आते हैं,। यह एक कतार या फर्स्ट-इन-फर्स्ट-आउट (फीफो) है। यदि आप चाहें तो आप उनमें से एक को सरणी या सूची में से एक बना सकते हैं।

वे किसके लिए अच्छे हैं? ठीक है, तुम एक पेड़ डेटा संरचना (जो लकड़ी से बना एक असली पेड़ की तरह है, सिवाय इसके कि यह उल्टा है) लगता है, और आप इतनी के रूप में सभी पत्ते बाहर मुद्रित करने के लिए, के माध्यम से यह पूरी तरह से चलने के लिए एक प्रोग्राम लिखने के लिए चाहते हैं।

एक तरीका गहराई-पहले चलना है। आप ट्रंक में शुरू करने और पहली शाखा के पास जाओ, और फिर, उस शाखा की पहली शाखा में जाते हैं, और इतने पर जब तक आप एक पत्ता के लिए मिलता है, और यह प्रिंट। लेकिन अगली शाखा में जाने के लिए आप कैसे बैक अप लेते हैं? ठीक है, हर बार जब आप एक शाखा है, तो आप "पुश" अपने ढेर में कुछ जानकारी नीचे जाना, और जब आप वापस ऊपर आप इसे वापस बाहर "पॉप", और कहा कि आपको यह बताती है शाखा अगले लेने के लिए। इस तरह आप ट्रैक करते हैं कि प्रत्येक बिंदु पर कौन सी शाखा अगले कार्य करेगी।

एक और तरीका है एक चौड़ाई-पहले चलना है। ट्रंक से शुरू करते हुए, आप ट्रंक से सभी शाखाओं को नंबर देते हैं, और उन संख्याओं को कतार में डाल देते हैं। तो फिर तुम एक नंबर के बाहर दूसरे छोर से लेते हैं, उस शाखा में जाते हैं, और हर शाखा यह के बंद आने के लिए, आप फिर से उन्हें नंबर (लगातार पहले के साथ) और कतार में उन डाल दिया। जैसे ही आप ऐसा करते रहेंगे, आप पहली शाखाओं की यात्रा करेंगे जो ट्रंक से 1 शाखा दूर हैं। फिर आप उन सभी शाखाओं का दौरा करने जा रहे हैं जो ट्रंक से 2 शाखाएं दूर हैं, और इसी तरह। आखिरकार आप पत्तियों तक पहुंच जाएंगे और आप उन्हें प्रिंट कर सकते हैं।

इन प्रोग्रामिंग में दो बहुत ही बुनियादी अवधारणाओं रहे हैं।

1

मुझे लगता है कि स्टैक और कतार दोनों मेमोरी एक्सेसिंग अवधारणाएं हैं जिनका उपयोग अनुप्रयोग की मांग के अनुसार किया जाता है। दूसरी ओर, सरणी और सूचियां दो मेमोरी एक्सेसिंग तकनीकें हैं और इन्हें स्टैक (एलआईएफओ) और कतार (एफआईएफओ) अवधारणाओं को लागू करने के लिए उपयोग किया जाता है।

संबंधित मुद्दे