मान लीजिए कि हमारे पास 1 से n तक अद्वितीय तत्वों की एक सरणी संख्या है। हमें यह जांचना होगा कि यह स्टैक-सॉर्टेबल है या नहीं। एक सरणी स्टैक सॉर्ट करने योग्य होती है जब इसे अस्थायी स्टैक का उपयोग करके किसी अन्य सरणी में संग्रहीत किया जा सकता है।
इसे हल करने के लिए, हम सरणी पर इनमें से किसी भी ऑपरेशन का उपयोग कर सकते हैं -
-
ऐरे के शुरुआती एलिमेंट को डिलीट करें और उस आइटम को स्टैक में पुश करें।
-
स्टैक के शीर्ष तत्व को हटाएं और इसे दूसरी सरणी के अंत में डालें।
अब यदि दिए गए सरणी के सभी तत्वों को इन परिचालनों द्वारा दूसरी सरणी में स्थानांतरित किया जाता है, तो दूसरी सरणी को गैर-घटते क्रम में क्रमबद्ध किया जाता है, तो दिया गया सरणी स्टैक सॉर्ट करने योग्य होता है।
इसलिए, यदि इनपुट संख्या =[8, 6, 5, 3, 1] की तरह है, तो आउटपुट सही होगा क्योंकि हम दो बार दक्षिणावर्त दिशा में घुमा सकते हैं तो इसे [1, 3, 4, 5, 6, 8]
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- एक स्टैक stk परिभाषित करें
- अंतिम:=0
- इनिशियलाइज़ i :=0 के लिए, जब i
करें - यदि stk खाली नहीं है, तो −
- शीर्ष:=stk का शीर्ष तत्व
- जबकि शीर्ष (अंतिम + 1) के समान है, −
- . करें
- अंतिम:=अंतिम + 1
- stk से पॉप
- यदि stk खाली है, तो:
- लूप से बाहर आएं
- शीर्ष:=stk का शीर्ष तत्व
- यदि stk खाली है, तो:
- v[i] को stk में पुश करें
- अन्यथा
- शीर्ष:=stk का शीर्ष तत्व
- अगर वी[i] <शीर्ष, तो:
- v[i] को stk में पुश करें
- अन्यथा
- झूठी वापसी
- अन्यथा
- v[i] को stk में पुश करें
- यदि stk खाली नहीं है, तो −
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; bool solve(vector<int> &v) { stack<int> stk; int last = 0; for (int i = 0; i < v.size(); i++) { if (!stk.empty()){ int top = stk.top(); while (top == last + 1) { last = last + 1; stk.pop(); if (stk.empty()){ break; } top = stk.top(); } if (stk.empty()) { stk.push(v[i]); }else{ top = stk.top(); if (v[i] < top){ stk.push(v[i]); }else{ return false; } } }else{ stk.push(v[i]); } } return true; } main(){ vector<int> v = {8, 6, 5, 3, 1}; cout << solve(v); }
इनपुट
{8, 6, 5, 3, 1}
आउटपुट
1