C++ STL :: stack
স্ট্যাকঃ
STL কন্টেইনারদের মধ্যে সম্ভবত সবচেয়ে সিম্পল ডাটা স্ট্রাকচার হল stack, এটা একটা লাস্ট ইন ফার্স্ট আউট (LIFO) ডাটা স্ট্রাকচার, মানে হল যে সবার শেষে আসবে, সে সবার আগে ভাগবে… সোজা কথায় এই কন্টেইনারের শুধুমাত্র একটা দিকেই ডাটা ইন্সার্ট বা এক্সট্র্যাক্ট করা হয়। আর STL এ stack তার ডিফল্ট ইন্টার্নাল ডাটা স্ট্রাকচার হিসাবে ব্যবহার করে STL এরই deque কন্টেইনার, তবে চাইলে vector বা list ও ব্যবহার করা যেতে পারে। যে সব কন্টেইনার push_back() আর pop_back() মেথড ২ টা সাপোর্ট করে সেগুলোকেই stack এর কন্টেইনার ক্লাস হিসাবে ব্যবহার করা যায়। stack আসলে একটা অ্যাডাপ্টার ক্লাস, অর্থাৎ, এটা তৈরি করা হয় এর ইন্টারনাল কন্টেইনারের স্পেসিফিক কিছু ফাংশনকে এলিমেন্ট একসেসের অনুমতি দিয়ে।
stack ব্যবহার করতে চাইলে সর্বপ্রথম কাজটা হল std <stack> হেডারটা প্রোগ্রামে ইনক্লুড করাঃ
#include <stack> using namespace std;
কন্সট্রাক্টরঃ
অন্যান্য STL কন্টেইনার ক্লাসের মত stack এরও সাধারণ কন্সট্রাক্টর stack< type_t > myStack; এই রকমের, তবে আরো অনেকভাবে ডিক্লেয়ার করা যায়। যেমনঃ
// constructing stacks #include <list> #include <vector> #include <deque> #include <stack> using namespace std; int main () { // using default container deque stack< int > first; // empty stack deque< int > mydeque(3, 100); // deque with 3 elements stack< int > second(mydeque); // from mydeque stack< int > third(second); // from another stack second // explicit container declarations stack< int, deque< int > > fourth; // empty stack using deque deque< int > newdeque(10, 100); // deque with 10 elements stack< int, deque< int > > fifth(newdeque); // from newdeque stack< int, vector< int > > sixth; // empty stack using vector vector< int > myvector(2, 200); // vector with 2 elements stack< int, vector< int > > seventh(myvector); // from myvector stack< int, list< int > > eighth; // empty srack using list list< int > mylist(4, 100); // list with 4 elements stack< int, list< int > > ninth(mylist); // from mylist // can refer to some other stack stack< int > tenth = first; // declaration time initialization return 0; }
কমপ্লেক্সিটিঃ কন্টেইনার কন্সট্রাকশনের সাপেক্ষে কন্সট্যান্ট, অতএব কি ধরণের কন্টেইনার ব্যবহার করা হচ্ছে তার উপরে নির্ভর করে।
এলিমেন্ট একসেসঃ
stack ক্লাসের এলিমেন্ট গুলাকে একসেস করার জন্য ৩ টা মেম্বার ফাংশন আছেঃ
- top()
- push()
- pop()
push() ফাংশনটার কাজ stack এর শেষে কোন এলিমেন্ট ইন্সার্ট করা, আর pop() দিয়ে লাস্ট এলিমেন্ট টা বের করে দেয়া। top() এর সাহায্যে কারেন্টলি stack এ সবার উপরের এলিমেন্ট কে পাওয়া যায়। top() এলিমেন্টকে স্ট্যান্ডার্ড অপারেটরদের সাহায্যে মডিফাই করা যায়।
আর, stack এর এলিমেন্ট কাউন্ট করার জন্য ২ টা ফাংশন আছেঃ
- size()
- empty()
size() ব্যবহার করে জানতে পারি এই মুহূর্তে stack এ কতগুলো এলিমেন্ট আছে, আর empty() একটা boolean ফাংশন, stack খালি থাকলে এটা true দেয়, না হলে false, stack এ pop() মেথডটা ব্যবহার করতে চাইলে আগে অবশ্যই চেক করে নিতে হবে stack এ কিছু আছে কিনা, তা না হলে run-time error হতে পারে।
নিচে এই ফাংশন গুলার কাজ দেখানো হলঃ
// stack::push/pop/top/size/empty #include <iostream> #include <stack> using namespace std; int main () { stack< int > mystack; // lets push and pop some values for (int i=0; i<5; i++) mystack.push(i); cout << "Popping out elements..."; while (!mystack.empty()) { cout << " " << mystack.top(); mystack.pop(); } cout << endl; // changing the value of top mystack.push(100); mystack.top() += 1000; cout << "Now top is: " << mystack.top() << endl; mystack.pop(); // not a good way to check if stack is empty if(mystack.size() == 0) cout << "Stack is empty" << endl; // better we do this if(mystack.empty()) cout << "Stack is empty" << endl; return 0; }
কমপ্লেক্সিটিঃ প্রতিটা ফাংশনের কম্পলেক্সিটি কন্সট্যান্ট।
শুভ কামনা।
ধন্যবাদ…
deque কী জিনিস বুঝলাম না । container কী
STL এর এই অবজেক্ট গুলাকে কমনলি কন্টেইনার বলে।
deque এক রকমের কন্টেইনার, এটা হলে “double ended queue”, এই সম্পর্কে সামনে পোস্ট আসতেছে।
একটা array declare করতে চাই যেখানে প্রতি index এ একটা করে stack রাখতে পারব….????
হ্যাঁ পারবা।
stack< int > S[100];
আর যদি stack of string declare করতে চাই? stl এর string na…C এর!!!
That is not a good practice. But you can do it. But you have to store all the strings to some memory location (i.e. array of c-strings) and then you could use the pointers.
stack< char * > S;
what is good in that case???
Just use C++ string objects….