एक ऐरे और स्टैक में क्या अंतर है?


10

विकिपीडिया के अनुसार, एक स्टैक :

एक अंतिम में, पहले बाहर (LIFO) सार डेटा प्रकार और रैखिक डेटा संरचना है।

जबकि एक सरणी :

तत्वों (मूल्यों या चर) के संग्रह से युक्त एक डेटा संरचना है, प्रत्येक को कम से कम एक सरणी सूचकांक या कुंजी द्वारा पहचाना जाता है।

जहां तक ​​मैं समझता हूं, वे काफी हद तक समान हैं। तो, मुख्य अंतर क्या हैं? यदि वे समान नहीं हैं, तो एक सरणी क्या कर सकती है जो स्टैक नहीं कर सकती है और इसके विपरीत?


5
विकिपीडिया में आपको जो कुछ मिला है, उससे आपके प्रश्न का उत्तर कैसे नहीं है। आप किसी भी क्रम में एक सरणी के तत्वों का उपयोग कर सकते हैं; स्टैक को LIFO ऑर्डर में एक्सेस किया जाना चाहिए।
कालेब

8
@ कैलेब सिर्फ इसलिए कि आप कुछ पढ़ते हैं इसका मतलब यह नहीं है कि आप अवधारणा को समझते हैं। जब तक मैंने पूछा, मेरे दिमाग में यह पूरी तरह से नहीं था।
डायनेमिक

3
-1 आपने मूल रूप से अपने प्रश्न में उत्तर पोस्ट किया है। ऐसा क्या है जो आप पूछ रहे हैं, फिर से?
एंड्रेस एफ

1
@AndresF। मैं यह नहीं समझ सकता कि इसका क्या मतलब है ... यदि आप एक विकिपीडिया लेख देख सकते हैं और समझ सकते हैं कि वे पहली बार क्या कह रहे हैं, तो दुनिया एकदम सही होगी।
डायनामिक

2
मैंने सिर्फ मेटा.प्रोग्रामर्स पढ़ा है और समझा कि आपने यह गैर-प्रश्न क्यों पूछा: यह एक प्रतियोगिता के लिए है। मुझे गंभीरता से संदेह है कि आप विकिपीडिया लेख को नहीं समझ पाए हैं। आप पर शर्म आती है: /
एंड्रेस एफ

जवाबों:


45

ठीक है, आप निश्चित रूप से एक सरणी के साथ एक स्टैक को लागू कर सकते हैं। अंतर पहुंच में है। एक सरणी में, आपके पास तत्वों की एक सूची है और आप किसी भी समय उनमें से किसी को भी एक्सेस कर सकते हैं। (एक पंक्ति में रखे गए लकड़ी के ब्लॉकों के एक समूह के बारे में सोचें।)

लेकिन एक स्टैक में, कोई रैंडम-एक्सेस ऑपरेशन नहीं है; केवल Push, Peekऔर Pop, सभी स्टैक के शीर्ष पर तत्व के साथ विशेष रूप से निपटते हैं। (लकड़ी के खंडों को ऊपर की ओर लंबवत रखें। आप टॉवर के शीर्ष के नीचे कुछ भी नहीं छू सकते हैं या यह ऊपर गिर जाएगा।)


11
लकड़ी के ब्लॉक - अच्छा सादृश्य
जेसी ब्लैक

1
आप कहते हैं, "एक स्टैक में, कोई रैंडम-एक्सेस ऑपरेशन नहीं है" लेकिन मैं असहमत हूं, और मेरे जवाब में अधिक विस्तार जोड़ूंगा।
स्कॉट व्हिटलॉक

स्टैक निश्चित रूप से रैंडम एक्सेस के साथ लागू होते हैं
old_timer

4
आपको जरेंग में चूसना चाहिए।
असंतुष्टगीत

1
@ मेसन, मुझे पता है। यह एक मजाक था।
असंतुष्टगीत

6

एक शुद्ध ढेर में, केवल स्वीकार्य संचालन कर रहे हैं Push, Popऔर Peekलेकिन व्यावहारिक दृष्टि से, कि वास्तव में सच नहीं है। या बल्कि, Peekऑपरेशन अक्सर आपको स्टैक पर किसी भी स्थिति को देखने की अनुमति देता है, लेकिन पकड़ यह है कि यह स्टैक के एक छोर के सापेक्ष है।

इसलिए, जैसा कि दूसरों ने कहा है, एक सरणी यादृच्छिक अभिगम है और सरणी की शुरुआत के लिए सब कुछ संदर्भित है

एक स्टैक में, आप केवल स्टैक के काम के अंत में जोड़ / हटा सकते हैं, लेकिन आपके पास अभी भी रैंडम एक्सेस रीड है लेकिन यह वर्किंग एंड के लिए संदर्भित है । यही मौलिक अंतर है।

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

यह एक विशेष उपयोग / कार्यान्वयन है, लेकिन यह अंतर दिखाता है: सरणी को हमेशा शुरुआत से संदर्भित किया जाता है, लेकिन स्टैक को हमेशा कुछ कार्यशील स्थिति से संदर्भित किया जाता है।

एक स्टैक का एक संभावित कार्यान्वयन एक सरणी प्लस है जो यह याद रखने के लिए एक सूचकांक है कि काम करना कहां है।


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

4

मुझे लगता है कि यहां चल रहा सबसे बड़ा भ्रम बुनियादी डेटा संरचनाओं को लागू करना है।

अधिकांश (अधिक मूल भाषाओं में) एक सरणी तत्वों की एक निश्चित लंबाई सेट का प्रतिनिधित्व करती है जिसे आप किसी भी समय एक्सेस कर सकते हैं। यह तथ्य कि आपके पास इस तरह के तत्वों का एक समूह है, यह आपको इस बारे में कुछ नहीं बताता है कि इसका उपयोग कैसे किया जाना चाहिए (और स्पष्ट रूप से एक कंप्यूटर को पता नहीं होगा कि आप इसका उपयोग कैसे करते हैं / देखभाल करते हैं, जब तक कि आप उपयोग का उल्लंघन नहीं करते हैं)।

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

आप कई अलग-अलग प्रकार के डेटा संरचनाओं से एक स्टैक बना सकते हैं: एरेज़ (कुछ अधिकतम आकार के साथ), डायनेमिक एरेज़ (स्पेस से बाहर होने पर बढ़ सकते हैं) या लिंक्ड लिस्ट। व्यक्तिगत रूप से मुझे लगता है कि एक लिंक की गई सूची एक स्टैक के प्रतिबंध का सबसे अच्छा प्रतिनिधित्व करती है जैसा कि आपको पहले तत्व से परे चीजों को देखने के लिए थोड़ा प्रयास करना पड़ता है और सामने से जोड़ना और सामने से हटाना बहुत आसान होता है।

तो आप एक ढेर बनाने के लिए एक सरणी का उपयोग कर सकते हैं, लेकिन वे समकक्ष नहीं हैं


3

उनकी जिम्मेदारियां अलग हैं:

  • स्टैक पर तत्वों को पॉप करने में सक्षम होना चाहिए और स्टैक से तत्वों को धक्का देना चाहिए, इसलिए इसमें सामान्य रूप से विधियां हैं Pop()औरPush()

  • एरे की जिम्मेदारी एक निर्दिष्ट सूचकांक पर तत्व प्राप्त / निर्धारित करना है


3

आप किसी आइटम को A \ array के किसी भी इंडेक्स से पुनः प्राप्त कर सकते हैं।

स्टैक के साथ, आप स्टैक ए के बीच में एक आइटम को पुनः प्राप्त कर सकते हैं, एक और स्टैक का उपयोग करके: बी।

आप शीर्ष आइटम को A से बाहर निकालते रहते हैं और जब तक आप A के इच्छित आइटम पर नहीं होते हैं तब तक B में रखते हैं, तो आप B को स्टैक A के ऊपर से वापस रखते हैं।

इसलिए, डेटा के लिए जिसे एक मनमाना सूचकांक प्राप्त करने की क्षमता की आवश्यकता होती है, स्टैक के साथ काम करना अधिक कठिन होता है।

उस स्थिति में जहां आप "आखिरी में, पहले बाहर" व्यवहार चाहते हैं, एक स्टैक आपको एक सरणी से कम ओवरहेड देगा।


0

मैं इतना नहीं कहूंगा कि वे "बहुत समान हैं।"

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

एक स्टैक चीजों के ट्रैक का तरीका है क्योंकि वे उत्पन्न होते हैं। एक पहुंच विधि का निर्माण किया गया प्रकार के आधार पर निहित / आवश्यक है। एक फ्रेम स्टैक एक LIFO उदाहरण होगा। डिस्क्लेमर - मैं अपने डेटा स्ट्रक्चर को यहाँ पर टैक्सोनोमी में मिला सकता हूँ और एक स्टैक सही मायने में केवल LIFO की अनुमति दे सकता है। यह अन्यथा एक अलग प्रकार की कतार होगी।

इसलिए मैं एक स्टैक के रूप में एक सरणी का उपयोग कर सकता हूं (हालांकि मैं नहीं चाहता), लेकिन मैं एक ऐरे के रूप में एक स्टैक का उपयोग नहीं कर सकता (जब तक कि मैं वास्तव में कठिन काम नहीं करता)।


1
'वस्तुओं के संग्रह के लिए संरचना' के क्षेत्र में, मैं नहीं कहूंगा कि वे बहुत समान हैं। प्रोग्रामिंग अवधारणाओं के क्षेत्र में, मैं कहूंगा कि वे काफी हद तक समान हैं। आम तौर पर चीजों के डोमेन में, मैं कहता हूं कि वे लगभग समान हैं।
कर्क ब्रॉडहार्ट

0

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


0

एक सरणी प्रोग्रामर के दृष्टिकोण से है, जो जगह और आकार में तय की गई है, आप जानते हैं कि आप इसमें कहां हैं और पूरी चीज कहां है। आप सभी तक इसकी पहुंच है।

एक स्टैक के साथ, आप इसके एक छोर पर बैठते हैं लेकिन इसके आकार का कोई पता नहीं है या आप कितनी दूर सुरक्षित रूप से जा सकते हैं। आपकी पहुँच आपकी उस राशि तक सीमित है जो आपने आवंटित की है, आप अक्सर यह भी नहीं जानते हैं कि जब आप चाहते थे तो राशि आवंटित करते समय यदि आप सिर्फ ढेर या प्रोग्राम स्पेस में पटक गए थे। स्टैक का आपका दृष्टिकोण एक छोटा सा सरणी है जिसे आपने खुद को आवंटित किया है, जिस आकार को आप चाहते थे, आपका नियंत्रण है और आप देख सकते हैं। आपका भाग किसी सरणी से अलग नहीं है। आपके सरणी में निहित अंतर तर्क और शब्दावली के लिए एक और सरणी के एक छोर पर स्थित है, जिसकी आपके पास कोई दृश्यता नहीं है, पता नहीं कितना बड़ा या छोटा है, और आप संभवतः बिना नुकसान पहुंचाए इसे छू सकते हैं। एक सरणी, जब तक कि वैश्विक न हो, अक्सर स्टैक पर वैसे भी लागू किया जाता है, इसलिए सरणी और स्टैक उस फ़ंक्शन की अवधि के लिए एक ही स्थान साझा करते हैं।

यदि आप हार्डवेयर पक्ष में जाना चाहते हैं, तो यह प्रोसेसर विशिष्ट है, लेकिन आम तौर पर सरणी एक ज्ञात शुरुआती बिंदु / पते पर आधारित होती है, आकार को कंपाइलर / प्रोग्रामर द्वारा जाना जाता है, और इसमें पते की गणना की जाती है, कभी-कभी रजिस्टर ऑफ़सेट एड्रेसिंग का उपयोग करना (इस बेस रजिस्टर वैल्यू द्वारा परिभाषित पते से एक मान लोड करना) और साथ ही यह ऑफ़सेट रजिस्टर वैल्यू, इसी तरह जब संकलित किया जाता है, तो यह तत्काल ऑफ़सेट जरूरी नहीं कि रजिस्टर आधारित हो सकता है, कोर्स के प्रोसेसर पर निर्भर करता है) जो असेंबली में बहुत अधिक है उच्च स्तरीय कोड में एक सरणी तक पहुँचने जैसा दिखता है। इसी तरह, स्टैक के साथ, यदि उपलब्ध हो, तो आप रजिस्टर या तत्काल ऑफसेट एड्रेसिंग का उपयोग कर सकते हैं, हालांकि यह एक विशेष रजिस्टर का उपयोग करता है, या तो स्टैक पॉइंटर, या कंपाइलर / प्रोग्रामर द्वारा आरक्षित रजिस्टर का उपयोग स्टैक फ्रेम तक पहुंचने के लिए किया जाता है। समारोह। और कुछ प्रोसेसरों के लिए स्टैक एक्सेस करने के लिए विशेष स्टैक एक्सेस फ़ंक्शंस का उपयोग और / या आवश्यक है। आपके पास पुश और पॉप निर्देश हैं, लेकिन वे उतनी बार उपयोग नहीं किए जाते जितना आप सोचते हैं और वास्तव में इस प्रश्न पर लागू नहीं होते हैं। कुछ प्रोसेसरों के लिए पुश और पॉप निर्देश के लिए उपनाम हैं जिनका उपयोग किसी भी रजिस्टर के साथ किया जा सकता है, कहीं भी, स्टैक पर केवल स्टैक पॉइंटर नहीं है, इस सवाल से संबंधित होने से पुश और पॉप को हटा दिया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.