ধরুন আমরা একটি স্ট্যাক ডিজাইন করতে চাই যা নিম্নলিখিত ক্রিয়াকলাপগুলিকে সমর্থন করে৷
-
CustomStack(int maxSize) এটি ম্যাক্সসাইজ দিয়ে অবজেক্টকে আরম্ভ করে যা স্ট্যাকের সর্বোচ্চ সংখ্যক উপাদান বা স্ট্যাকটি ম্যাক্সসাইজে পৌঁছে গেলে কিছুই করবেন না।
-
void push(int x) এটি স্ট্যাকের শীর্ষে x সন্নিবেশ করায় যদি স্ট্যাকটি সর্বাধিক আকারে না পৌঁছায়।
-
int pop() এটি স্ট্যাকের উপরের অংশটি মুছে দেয় বা ফেরত দেয় যদি স্ট্যাকটি খালি থাকে।
-
void inc(int k, int val) এটি স্ট্যাকের নীচের k উপাদানগুলিকে ভ্যাল দ্বারা বৃদ্ধি করে। স্ট্যাকের মধ্যে k-এর কম উপাদান থাকলে, স্ট্যাকের সমস্ত উপাদান বৃদ্ধি করুন।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
দুটি অ্যারে st এবং inc সংজ্ঞায়িত করুন এবং একটি পূর্ণসংখ্যা টাইপ ডেটা ক্যাপ তৈরি করুন
-
ইনিশিয়ালাইজারে, ক্যাপ সেট করুন :=N এবং সেট inc :=N + 10 আকারের একটি নতুন অ্যারে
-
পুশ(এক্স) পদ্ধতির জন্য, যদি স্ট্যাকের আকার ক্যাপ না হয়, তাহলে st-এ x ঢোকান।
-
পপ() অপারেশন −
এর মত হবে -
যদি st খালি হয়, তাহলে -1
ফেরত দিন -
অন্যথায়
-
স্ট্যাকের শীর্ষ :=স্ট্যাকের শীর্ষ + inc[স্ট্যাকের শীর্ষ সূচক]
-
স্ট্যাকের যদি কিছু উপাদান থাকে, তাহলে inc[st - 2 এর আকার] inc[st-1 এর আকার]
-
inc[s - 1 এর আকার] :=0
-
x :=st
এর শেষ উপাদান -
রিটার্ন x
-
-
inc() পদ্ধতিটি নিম্নরূপ কাজ করবে -
-
k 1 দ্বারা হ্রাস করুন
-
k :=k এর মিনিমাম এবং st এর সাইজ – 1
-
k <0 হলে, ফেরত দিন
-
ভ্যাল দ্বারা inc[k] বাড়ান।
উদাহরণ (C++)
আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -
#include <bits/stdc++.h>
using namespace std;
class CustomStack {
public:
vector <int> st;
vector <int> inc;
int cap;
CustomStack(int N) {
cap = N;
inc = vector <int>(N + 10);
}
void push(int x) {
if(st.size() == cap) return;
st.push_back(x);
}
int pop() {
if(st.empty()) return -1;
else{
st.back() += inc[st.size() - 1];
if(st.size() - 1 > 0 ){
inc[st.size() - 2] += inc[st.size() - 1];
}
inc[st.size() - 1] = 0;
int x = st.back();
st.pop_back();
return x;
}
}
void increment(int k, int val) {
k--;
k = min(k, (int)st.size() - 1);
if(k < 0) return;
inc[k] += val;
}
};
main(){
CustomStack ob(3);
ob.push(1);
ob.push(2);
cout << ob.pop() << endl;
ob.push(2);
ob.push(3);
ob.push(4);
ob.increment(5, 100);
ob.increment(2, 100);
cout << ob.pop() << endl;
cout << ob.pop() << endl;
cout << ob.pop() << endl;
cout << ob.pop() << endl;
} ইনপুট
See the main() in the program
আউটপুট
2 103 202 201 -1