Stack (স্ট্যাক) হল একটি ডেটা স্ট্রাকচার যা Last In, First Out (LIFO) নীতি অনুসরণ করে। এর মানে হল যে, স্ট্যাকের মধ্যে সবচেয়ে শেষের আইটেমটি প্রথমে বের হয়ে আসে। স্ট্যাক এমন একটি তালিকা যেখানে শুধুমাত্র একটিমাত্র প্রান্তে ডেটা ইনসার্ট (Push) এবং ডেটা রিমুভ (Pop) করা সম্ভব, অন্য কোন প্রান্তে অপারেশন সম্ভব নয়। স্ট্যাকের ব্যবহার অনেক ক্ষেত্রেই কার্যকর, যেমন রিকার্সন (recursion), এক্সপ্রেশন ইভ্যালুয়েশন, ব্যাকট্র্যাকিং ইত্যাদি।
Stack এর ধারণা
স্ট্যাক একটি লিনিয়ার ডেটা স্ট্রাকচার যা একে একে উপাদান সংরক্ষণ করে, কিন্তু ডেটার অ্যাক্সেস শুধুমাত্র এক প্রান্ত থেকে হতে পারে। স্ট্যাকের দুটি প্রধান অপারেশন রয়েছে:
- Push (পুশ): নতুন উপাদান স্ট্যাকের উপরে যোগ করা।
- Pop (পপ): স্ট্যাকের শীর্ষ থেকে উপাদান মুছে ফেলা এবং বের করা।
স্ট্যাকের মধ্যে সাধারণত আরও দুটি অ্যাক্সেসযোগ্য অপারেশন থাকে:
- Peek (পীক): স্ট্যাকের শীর্ষে থাকা উপাদান দেখা, তবে এটি মুছে ফেলা হয় না।
- IsEmpty (ইজএম্পটি): স্ট্যাকটি খালি কি না তা পরীক্ষা করা।
স্ট্যাকের কাজের নীতি Last In, First Out (LIFO), যা এর নামের সাথে মেলে। উদাহরণস্বরূপ, একটি পুস্তক স্ট্যাকের মধ্যে যদি ৩টি বই রাখা হয়, তবে সর্বশেষে রাখা বইটি প্রথমে উঠানো হবে।
Stack এর ব্যবহার
স্ট্যাকের অনেকগুলি বাস্তব জীবনের ব্যবহার রয়েছে, যেগুলি বিভিন্ন ক্ষেত্রে গুরুত্বপূর্ণ। এখানে কিছু উদাহরণ দেওয়া হলো:
1. রিকার্সন (Recursion)
স্ট্যাক সাধারণত রিকার্সন ফাংশন কলের জন্য ব্যবহৃত হয়। যখন একটি ফাংশন পুনরায় নিজেকে কল করে, তখন সিস্টেম স্ট্যাক ব্যবহার করে তার কলগুলির সারণী তৈরি করে।
উদাহরণ:
public class RecursionExample {
public static void recursiveFunction(int n) {
if (n == 0) return;
System.out.println(n);
recursiveFunction(n - 1); // Recursive call
}
public static void main(String[] args) {
recursiveFunction(5); // আউটপুট হবে 5, 4, 3, 2, 1
}
}
2. ব্যাকট্র্যাকিং (Backtracking)
ব্যাকট্র্যাকিং অ্যালগরিদমে স্ট্যাক ব্যবহৃত হয় বিভিন্ন বিকল্প পছন্দের উপর পরীক্ষা-নিরীক্ষা করার জন্য। এটি সাধারণত পাজল সলভিং, ম্যাজিক সিউব ইত্যাদি ক্ষেত্রে ব্যবহৃত হয়।
3. এক্সপ্রেশন ইভ্যালুয়েশন (Expression Evaluation)
স্ট্যাক ব্যবহৃত হয় এক্সপ্রেশন যেমন ইনফিক্স (Infix), পোস্টফিক্স (Postfix), এবং প্রিফিক্স (Prefix) এক্সপ্রেশন গুলি ইভ্যালুয়েট করার জন্য।
4. ইউজার ইনপুট হ্যান্ডলিং
অনেক অ্যাপ্লিকেশন যেমন ব্রাউজার বা টেক্সট এডিটরে, ব্যবহারকারীর আগের ইনপুট বা কর্মকাণ্ড সঠিকভাবে ট্র্যাক করতে স্ট্যাক ব্যবহার করা হয়, যাতে সহজে ফিরে আসা যায়।
Stack এর জাভা ইমপ্লিমেন্টেশন
জাভায় স্ট্যাক ইমপ্লিমেন্ট করতে আমরা সাধারণত java.util.Stack ক্লাস ব্যবহার করি। এটি স্ট্যাকের কার্যকারিতা প্রদান করে যেমন push(), pop(), peek(), isEmpty() ইত্যাদি।
উদাহরণ:
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
// Push operation
stack.push(10);
stack.push(20);
stack.push(30);
// Pop operation
System.out.println("Popped element: " + stack.pop()); // আউটপুট হবে 30
// Peek operation
System.out.println("Top element: " + stack.peek()); // আউটপুট হবে 20
// Check if stack is empty
System.out.println("Is stack empty? " + stack.isEmpty()); // আউটপুট হবে false
}
}
এখানে:
push()স্ট্যাকের শীর্ষে একটি নতুন উপাদান যোগ করে।pop()শীর্ষের উপাদানটি মুছে ফেলে এবং সেটি রিটার্ন করে।peek()শুধুমাত্র শীর্ষের উপাদানটি রিটার্ন করে, কিন্তু তা মুছে ফেলে না।isEmpty()স্ট্যাকটি খালি কিনা তা পরীক্ষা করে।
সারাংশ
স্ট্যাক একটি অত্যন্ত গুরুত্বপূর্ণ ডেটা স্ট্রাকচার যা Last In, First Out (LIFO) নীতি অনুসরণ করে। এটি ব্যবহৃত হয় রিকার্সন, ব্যাকট্র্যাকিং, এক্সপ্রেশন ইভ্যালুয়েশন এবং অনেক ধরনের সিস্টেম অপারেশনে। জাভায় স্ট্যাকের জন্য Stack ক্লাস প্রদান করা হয়েছে, যা ইনবিল্ট ফাংশনালিটি দিয়ে স্ট্যাকের বিভিন্ন অপারেশন যেমন push(), pop(), peek(), isEmpty() ইত্যাদি সহজে ব্যবহার করতে সাহায্য করে। স্ট্যাকের কার্যকারিতা এবং ব্যবহার বিভিন্ন বাস্তব জীবনের সমস্যাগুলির সমাধানে অত্যন্ত গুরুত্বপূর্ণ ভূমিকা পালন করে।
Read more