ধরুন আমাদের 1 থেকে n পর্যন্ত অনন্য উপাদানগুলির একটি অ্যারে সংখ্যা রয়েছে। আমাদের এটি স্ট্যাক-সর্টেবল কিনা তা পরীক্ষা করতে হবে। একটি অ্যারে স্ট্যাক বাছাইযোগ্য হয় যখন এটি একটি অস্থায়ী স্ট্যাক ব্যবহার করে অন্য কোনো অ্যারেতে সংরক্ষণ করা যায়।
এটি সমাধান করার জন্য, আমরা অ্যারে −
-এ এই অপারেশনগুলির যেকোনো একটি ব্যবহার করতে পারি-
অ্যারের শুরুর উপাদানটি মুছুন এবং সেই আইটেমটিকে স্ট্যাকের মধ্যে ঠেলে দিন৷
৷ -
স্ট্যাকের উপরের উপাদানটি মুছুন এবং দ্বিতীয় অ্যারের শেষে সন্নিবেশ করুন।
এখন যদি এই ক্রিয়াকলাপগুলির মাধ্যমে প্রদত্ত অ্যারের সমস্ত উপাদান দ্বিতীয় অ্যারেতে স্থানান্তরিত হয় যাতে দ্বিতীয় অ্যারেটি অ-হ্রাস ক্রমে সাজানো হয়, তাহলে প্রদত্ত অ্যারেটি স্ট্যাক বাছাইযোগ্য৷
সুতরাং, যদি ইনপুটটি nums =[8, 6, 5, 3, 1] এর মতো হয়, তাহলে আউটপুটটি True হবে কারণ আমরা ঘড়ির কাঁটার দিকে দুইবার ঘোরাতে পারি তাহলে এটি [1, 3, 4, 1] এর মতো সাজানো হবে। 5, 6, 8]
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- এক স্ট্যাক stk সংজ্ঞায়িত করুন
- শেষ :=0
- আরম্ভ করার জন্য i :=0, যখন i
করুন - যদি stk খালি না হয়, তাহলে −
- top :=stk এর শীর্ষ উপাদান
- যখন উপরেরটি (শেষ + 1) এর মতো, −
- করুন
- শেষ :=শেষ + ১
- stk থেকে পপ
- যদি stk খালি হয়, তাহলে:
- লুপ থেকে বেরিয়ে আসুন
- top :=stk এর শীর্ষ উপাদান
- যদি stk খালি হয়, তাহলে:
- v[i] stk-এ ঠেলে
- অন্যথায়
- top :=stk এর শীর্ষ উপাদান
- যদি v[i]
- v[i] stk-এ ঠেলে
- অন্যথায়
- মিথ্যে ফেরত দিন
- যদি stk খালি না হয়, তাহলে −
- v[i] 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