एक सरणी में दो स्टैक कैसे लागू करें?


15

मैं यह कहकर शुरू करना चाहता हूं कि यह एक गृहकार्य नहीं है। मैं एक बेहतर प्रोग्रामर बनने के लिए इंट्रोडक्शन टू अल्गोरिदम - प्रसिद्ध सीएलआरएस पाठ पढ़ रहा हूं। मैं पुस्तक में दी गई समस्याओं और अभ्यासों को स्वयं हल करने का प्रयास कर रहा हूं।

मैं CLRS द्वितीय संस्करण से अध्याय 10 प्राथमिक डेटा संरचनाओं से एक्सर्साइज़ 10.1-2 को हल करने की कोशिश कर रहा हूं । यहाँ बताया गया है:

बताइए कि एक ए [ए 1. एन] में दो स्टैक को कैसे लागू किया जाए, ताकि जब तक दोनों स्टैक में तत्वों की कुल संख्या n न हो, तब तक न तो ओवरफ्लो हो सके । PUSH और POP संचालन O (1) समय में चलना चाहिए ।

इसका समाधान जो मैं अब तक लेकर आया हूं वह है:

सरणी चलो एक [1..n] दो ढेर को लागू: एस 1 [1..i] और एस 2 [i..n]

के लिए PUSH-एस 1 और PUSH-S2 संचालन, अगर ढेर 'पूर्ण' है तो में तत्वों को आगे बढ़ाने शुरू अन्य ढेर (जैसे। अगर ढेर एस 1 पूर्ण जब एक नए तत्व, में पुश करने की कोशिश कर रहा है तो में उस तत्व धक्का है स्टैक S2 और इसके विपरीत)।

इस दृष्टिकोण के साथ समस्या यह है कि मैं पीओपी-एस 1 या पीओपी-एस 2 को मज़बूती से नहीं देख पाऊंगा क्योंकि यह याद रखने का कोई तरीका नहीं है कि कौन सा तत्व किस स्टैक का है। यदि स्टैक के तत्व (की, वैल्यू) जोड़े हैं, तो स्टैक नंबर होने की कुंजी है, तो एक तत्व पॉप करने के लिए मुझे सबसे खराब स्थिति में, i या (ni) बार - जो O (n) होगा ) (अगर मैं यहां गलत हूं तो मुझे सुधारने के लिए स्वतंत्र महसूस करें), जो ओ (1) नहीं होगा ।

मैं काफी समय से इस सवाल पर अपना सिर पीट रहा हूं। क्या मैं सही रास्ते पर हूं? क्या कोई इस समस्या को हल करने के लिए मेरे संभावित संकेत दे सकता है?

सामान्य तौर पर, मुझे इन समस्याओं के बारे में कैसे सोचना चाहिए? या केवल वास्तव में बुद्धिमान लोग ही इस प्रकार की समस्याओं का समाधान कर सकते हैं? इन समस्याओं (जैसे अनुभव प्राप्त करना) से निपटने / हल करने से क्या मुझे इस पर बेहतर बनने में मदद मिलेगी?

मुझे आत्मज्ञान की प्रतीक्षा है।


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

जवाबों:


7

युवल ने जो कहा उसके अलावा एक और संकेत: यह एक विशिष्ट तरीके से स्टैक को जगह देने में मदद करता है और उनके विकास की दिशा को तदनुसार ठीक करता है। उन्हें एक ही दिशा में बढ़ने की जरूरत नहीं है।


5

यहाँ कुछ संकेत दिए गए हैं:

  1. ढेर में से एक को "ऊपर" और दूसरे को "नीचे" बढ़ना चाहिए।
  2. यह याद रखने का कोई तरीका नहीं है कि कौन सा तत्व किस स्टैक का है - आपको अतिरिक्त चर का उपयोग करने की अनुमति है ताकि आप उस तरह से सामान ले सकें। (यह पहले संकेत द्वारा प्रस्तावित समाधान के साथ अधिक समझ में आता है।)

1

पहला स्टैक 1 से शुरू होता है और n की ओर बढ़ता है, जबकि दूसरा n से शुरू होता है और 1. की ओर बढ़ता है। स्टैक ओवरफ्लो तब होता है जब एक तत्व को धक्का दिया जाता है जब दो स्टैक पॉइंटर्स समीप होते हैं।


1

यह विधि कुशलतापूर्वक उपलब्ध स्थान का उपयोग करती है। यह एक अतिप्रवाह का कारण नहीं बनता है अगर गिरफ्तारी में जगह उपलब्ध है []। गिरफ्तारी के दो चरम कोनों से दो ढेर शुरू करने का विचार है []। स्टैक 1 सबसे बाएं तत्व से शुरू होता है, स्टैक 1 में पहला तत्व इंडेक्स 0. पर धकेल दिया जाता है। स्टैक 2 दाएं कोने से शुरू होता है, स्टैक 2 में पहला तत्व इंडेक्स (एन -1) पर धकेल दिया जाता है। दोनों ढेर विपरीत दिशा में बढ़ते हैं (या सिकुड़ते हैं)। अतिप्रवाह के लिए जाँच करने के लिए, हम सभी की जाँच करने की आवश्यकता है दोनों ढेर के शीर्ष तत्वों के बीच की जगह के लिए।


-1

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


एनएनएन/2

-2

कुछ संकेत

एक सरणी बनाएं

स्टैक 1 के लिए विषम सूचकांक वाले सरणी तत्व हैं

अनुक्रमणिका के साथ ऐरे तत्व भी स्टैक 2 के लिए हैं

अब आप दोनों स्टैक को बाएं से दाएं दिशा में बढ़ा सकते हैं

बस वैरिएबल रखें जो दोनों स्टैक की शीर्ष स्थिति बनाए रखें। आपको एरे को खोजना नहीं पड़ेगा।

और अगर stack2 पूरा भरा हुआ है, जबकि stack2 खाली है, तो आप कुछ चरों को बनाए रखकर stack2 में अतिरिक्त stack1 तत्वों के लिए ट्रैक रख सकते हैं


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