Queue এবং Deque ইন্টারফেসগুলি Java Collections Framework এর অংশ এবং এগুলি ডেটা স্ট্রাকচারগুলো যা এলিমেন্ট সংরক্ষণ এবং পরিচালনা করতে সহায়ক। Queue এবং Deque উভয়ই java.util প্যাকেজের অন্তর্গত এবং এগুলোর মধ্যে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে। এই দুটি ইন্টারফেসের উদ্দেশ্য হল এলিমেন্টগুলির একসাথে প্রক্রিয়াকরণ, তবে তাদের ব্যবহারের পদ্ধতি এবং অ্যাক্সেস প্যাটার্ন কিছুটা আলাদা।
Queue Interface:
Queue একটি ডেটা স্ট্রাকচার যা FIFO (First In First Out) পদ্ধতি অনুসরণ করে। অর্থাৎ, প্রথমে যে উপাদানটি Queue-এ যোগ করা হয়, সেটি প্রথমে সরানো হবে। Queue সাধারণত scheduling, message processing, এবং task management এর মতো ক্ষেত্রে ব্যবহৃত হয়, যেখানে অর্ডার বজায় রেখে এলিমেন্টগুলি প্রক্রিয়া করা প্রয়োজন।
Queue Interface এর বৈশিষ্ট্যসমূহ:
- FIFO (First In, First Out): Queue ডেটা স্ট্রাকচারের মধ্যে প্রথমে যোগ করা উপাদানটি প্রথমে বের হয়।
- Insert at the end, remove from the front: এলিমেন্টগুলো Queue-এ যোগ করা হয় শেষে এবং সরানো হয় প্রথমে।
- Peek and Poll: peek() মেথডটি প্রথম এলিমেন্ট দেখতে দেয়, কিন্তু সরায় না, আর poll() মেথডটি প্রথম এলিমেন্ট সরিয়ে দেয়।
Queue Interface এর মেথডগুলো:
- add(E e): একটি উপাদান Queue-এ যোগ করে।
- remove(): প্রথম উপাদানটি সরায় এবং সেটি Queue থেকে রিটার্ন করে।
- peek(): প্রথম উপাদানটি ফেরত দেয় কিন্তু সরায় না।
- poll(): প্রথম উপাদানটি সরায় এবং সেটি ফেরত দেয়। যদি Queue খালি থাকে তবে null ফেরত দেয়।
Queue Interface এর উদাহরণ:
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
// Add elements to the queue
queue.add("Java");
queue.add("Python");
queue.add("JavaScript");
// Displaying the first element using peek()
System.out.println("First Element (Peek): " + queue.peek());
// Removing and displaying elements using poll()
System.out.println("Removed Element (Poll): " + queue.poll());
System.out.println("Removed Element (Poll): " + queue.poll());
// Remaining elements
System.out.println("Remaining Queue: " + queue);
}
}
Output:
First Element (Peek): Java
Removed Element (Poll): Java
Removed Element (Poll): Python
Remaining Queue: [JavaScript]
ব্যাখ্যা:
- Queue এর মধ্যে প্রথমে Java যোগ করা হয়েছিল, তাই প্রথমে Java সরানো হয়।
- peek() মেথড প্রথম এলিমেন্টকে দেখায়, কিন্তু সরায় না।
- poll() মেথড প্রথম এলিমেন্টকে সরিয়ে দেয় এবং ফিরিয়ে দেয়।
Deque Interface:
Deque (Double-Ended Queue) ইন্টারফেসটি Queue ইন্টারফেসের একটি উন্নত সংস্করণ, যা FIFO এর পাশাপাশি LIFO (Last In First Out) পদ্ধতিতেও কাজ করতে পারে। এটি Queue এর সমস্ত কার্যকারিতা সরবরাহ করে, তবে এর সাথে addFirst(), addLast(), removeFirst(), এবং removeLast() এর মতো মেথডগুলিও থাকে, যা ডাবল-এন্ডেড কিউয়ের কার্যকারিতা প্রদান করে। অর্থাৎ, আপনি Deque-এ উপাদান প্রথমেও যোগ করতে পারেন এবং শেষে থেকেও সরাতে পারেন, এবং এটি Queue এর মতো FIFO বা Stack এর মতো LIFO পদ্ধতি সমর্থন করতে সক্ষম।
Deque Interface এর বৈশিষ্ট্যসমূহ:
- FIFO এবং LIFO সমর্থন: Deque আপনাকে এলিমেন্টগুলি প্রথমে এবং শেষে থেকে অ্যাক্সেস করতে দেয়, যা Stack এবং Queue উভয়ের সুবিধা প্রদান করে।
- Bidirectional: Deque-এর মাধ্যমে আপনি Queue বা Stack এর মতো কাজ করতে পারেন, কিন্তু একে reverse করে ব্যবহৃত হতে পারে।
Deque Interface এর মেথডগুলো:
- addFirst(E e): উপাদানটি প্রথমে যোগ করে।
- addLast(E e): উপাদানটি শেষের দিকে যোগ করে।
- removeFirst(): প্রথম উপাদান সরায় এবং সেটি ফেরত দেয়।
- removeLast(): শেষ উপাদান সরায় এবং সেটি ফেরত দেয়।
- peekFirst(): প্রথম উপাদানটি ফেরত দেয় কিন্তু সরায় না।
- peekLast(): শেষ উপাদানটি ফেরত দেয় কিন্তু সরায় না.
Deque Interface এর উদাহরণ:
import java.util.ArrayDeque;
import java.util.Deque;
public class DequeExample {
public static void main(String[] args) {
Deque<String> deque = new ArrayDeque<>();
// Adding elements at both ends
deque.addFirst("Java");
deque.addLast("Python");
deque.addFirst("JavaScript");
// Displaying elements
System.out.println("Deque: " + deque);
// Removing and displaying elements from both ends
System.out.println("Removed from front: " + deque.removeFirst());
System.out.println("Removed from rear: " + deque.removeLast());
// Remaining deque elements
System.out.println("Remaining Deque: " + deque);
}
}
Output:
Deque: [JavaScript, Java, Python]
Removed from front: JavaScript
Removed from rear: Python
Remaining Deque: [Java]
ব্যাখ্যা:
- addFirst() মেথডটি উপাদানকে প্রথমে যোগ করে, এবং addLast() মেথডটি শেষের দিকে যোগ করে।
- removeFirst() এবং removeLast() মেথডগুলি যথাক্রমে প্রথম এবং শেষের উপাদান সরিয়ে দেয়।
Queue এবং Deque Interface-এর মধ্যে পার্থক্য:
| Attribute | Queue | Deque |
|---|---|---|
| Access Type | FIFO (First In First Out) | FIFO এবং LIFO (Double-ended) |
| Insertion/Removal | Only from the end/front (one side) | From both ends (first and last) |
| Used for | Task scheduling, FIFO based data | Stack-like (LIFO) or Queue-like (FIFO) |
| Key Methods | add(), remove(), peek(), poll() | addFirst(), addLast(), removeFirst(), removeLast() |
Use Cases:
- Queue: কার্যকরীভাবে task scheduling, message queuing, এবং FIFO data management-এ ব্যবহৃত হয়।
- Deque: Stack এবং Queue উভয়ের মত কাজ করে, যেমন undo/redo operations, task scheduling বা data buffering এর জন্য উপযুক্ত।
- Queue এবং Deque ইন্টারফেস Java Collections Framework এর গুরুত্বপূর্ণ অংশ এবং এগুলি বিভিন্ন প্রোগ্রামিং কাজের জন্য অত্যন্ত কার্যকরী ডেটা স্ট্রাকচার সরবরাহ করে।
- Queue FIFO ভিত্তিক কিউ ব্যবস্থাপনার জন্য ব্যবহৃত হয়, যেখানে Deque দ্বৈত-শেষ কিউ (double-ended queue) হিসাবে কাজ করতে পারে, যা FIFO এবং LIFO উভয় পদ্ধতি সমর্থন করে।
java.util.Queue এবং java.util.Deque ইন্টারফেস দুটি Java Collections Framework এর অংশ এবং ডেটা স্ট্রাকচারগুলোর মধ্যে FIFO (First In First Out) এবং LIFO (Last In First Out) এর মতো কাজ করে। Queue এবং Deque ইন্টারফেসের মাধ্যমে আপনি উপাদানগুলোকে নির্দিষ্ট নিয়মে (যেমন, queue বা stack এর মতো) প্রক্রিয়া করতে পারেন।
1. Queue Interface
Queue ইন্টারফেস হল একটি collection যা FIFO (First In, First Out) ভিত্তিতে কাজ করে। এর অর্থ হলো প্রথমে যোগ করা উপাদানটি প্রথমে বের করা হবে। Queue সাধারণত linear data structure হিসেবে কাজ করে, যেখানে উপাদানগুলো একের পর এক প্রবাহিত হয়।
Key Features of Queue Interface:
- FIFO (First In, First Out): প্রথমে যোগ করা উপাদান প্রথমে বের হয়।
- add(): উপাদানটি যুক্ত করার জন্য ব্যবহৃত হয়।
- remove(): প্রথম উপাদানটি মুছে ফেলার জন্য ব্যবহৃত হয়।
- peek(): প্রথম উপাদানটি দেখতে দেয়, কিন্তু মুছে ফেলে না।
- offer(): উপাদানটি যুক্ত করার জন্য ব্যবহৃত হয়, কিন্তু যদি Queue পূর্ণ থাকে তবে false ফেরত দেয়।
Example: Queue Implementation (Using LinkedList)
import java.util.Queue;
import java.util.LinkedList;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
// Adding elements to the queue
queue.add("Apple");
queue.add("Banana");
queue.add("Orange");
// Printing the queue
System.out.println("Queue: " + queue);
// Removing elements from the queue
System.out.println("Removed element: " + queue.remove());
// Peek at the first element
System.out.println("First element: " + queue.peek());
// Printing the updated queue
System.out.println("Updated Queue: " + queue);
}
}
Output:
Queue: [Apple, Banana, Orange]
Removed element: Apple
First element: Banana
Updated Queue: [Banana, Orange]
ব্যাখ্যা:
Queueইন্টারফেসের বাস্তবায়ন হিসেবেLinkedListব্যবহার করা হয়েছে।add()মেথডের মাধ্যমে উপাদান যোগ করা হয়েছে,remove()মেথডের মাধ্যমে প্রথম উপাদানটি মুছে ফেলা হয়েছে এবংpeek()মেথডে প্রথম উপাদানটি দেখা হয়েছে।
2. Deque Interface
Deque (Double-Ended Queue) ইন্টারফেস হল একটি Queue এর উন্নত সংস্করণ যা উপাদানগুলিকে দুই দিক থেকে (প্রথমে এবং শেষে) যোগ এবং মুছে ফেলার সুবিধা প্রদান করে। Deque FIFO এবং LIFO (Last In, First Out) উভয় ধরণের অপারেশন সমর্থন করে। এটি সাধারণত double-ended queue হিসেবে পরিচিত, যেখানে আপনি উভয় দিক থেকেই উপাদান অ্যাক্সেস করতে পারেন।
Key Features of Deque Interface:
- FIFO and LIFO: Deque উভয় ধরণের অপারেশন সমর্থন করে (FIFO এবং LIFO)।
- addFirst(): প্রথমে উপাদান যোগ করা হয়।
- addLast(): শেষে উপাদান যোগ করা হয়।
- removeFirst(): প্রথম উপাদান মুছে ফেলা হয়।
- removeLast(): শেষ উপাদান মুছে ফেলা হয়।
- peekFirst(): প্রথম উপাদান দেখতে পাওয়া যায়।
- peekLast(): শেষ উপাদান দেখতে পাওয়া যায়।
Example: Deque Implementation (Using LinkedList)
import java.util.Deque;
import java.util.LinkedList;
public class DequeExample {
public static void main(String[] args) {
Deque<String> deque = new LinkedList<>();
// Adding elements to the deque
deque.addFirst("Apple");
deque.addLast("Banana");
deque.addLast("Orange");
// Printing the deque
System.out.println("Deque: " + deque);
// Removing elements from the deque
System.out.println("Removed first element: " + deque.removeFirst());
System.out.println("Removed last element: " + deque.removeLast());
// Peek at the first and last element
System.out.println("First element: " + deque.peekFirst());
System.out.println("Last element: " + deque.peekLast());
// Printing the updated deque
System.out.println("Updated Deque: " + deque);
}
}
Output:
Deque: [Apple, Banana, Orange]
Removed first element: Apple
Removed last element: Orange
First element: Banana
Last element: Banana
Updated Deque: [Banana]
ব্যাখ্যা:
Dequeইন্টারফেসের বাস্তবায়ন হিসেবেLinkedListব্যবহার করা হয়েছে।addFirst()এবংaddLast()মেথডের মাধ্যমে উপাদান উভয় দিক থেকে যোগ করা হয়েছে।removeFirst()এবংremoveLast()মেথডের মাধ্যমে উপাদান উভয় দিক থেকে মুছে ফেলা হয়েছে।
Queue এবং Deque এর মধ্যে পার্থক্য
| Feature | Queue | Deque |
|---|---|---|
| Insertion | Only at the end (FIFO) | At both ends (FIFO and LIFO) |
| Removal | Only from the front (FIFO) | From both ends (FIFO and LIFO) |
| Common Implementations | LinkedList, PriorityQueue | LinkedList, ArrayDeque |
| Flexibility | Less flexible (only FIFO) | More flexible (FIFO and LIFO) |
| Efficiency | Efficient for FIFO operations | Efficient for both FIFO and LIFO operations |
When to Use Queue and Deque?
- Queue:
- ব্যবহার করুন যখন আপনি FIFO পদ্ধতি অনুসরণ করে উপাদান গুলি প্রক্রিয়া করতে চান, যেমন task scheduling, buffering ইত্যাদি।
- Deque:
- ব্যবহার করুন যখন আপনি FIFO বা LIFO যেকোনো পদ্ধতি ব্যবহার করতে চান, যেমন undo/redo operations, deque-based sliding window algorithms, deque-based double-ended queues ইত্যাদি।
- Queue ইন্টারফেস একটি FIFO (First In First Out) ডেটা স্ট্রাকচার প্রদান করে, যেখানে উপাদানগুলি একে একে প্রক্রিয়া হয় এবং প্রথমে যোগ করা উপাদানটি প্রথমে বের হয়।
- Deque ইন্টারফেস একটি উন্নত ডেটা স্ট্রাকচার যা উপাদানগুলি উভয় দিক থেকে (প্রথমে এবং শেষে) যোগ এবং মুছে ফেলতে পারে এবং এটি FIFO এবং LIFO উভয় পদ্ধতি সমর্থন করে।
আপনার প্রোগ্রামে যদি আপনি FIFO (queue) বা LIFO (stack) প্রক্রিয়া করতে চান, তবে Queue এবং Deque ইন্টারফেসে নির্দিষ্ট মেথডগুলোর মাধ্যমে আপনি সেই কাজগুলো সহজেই করতে পারবেন।
Queue এবং Deque ইন্টারফেসগুলি Java Collections Framework এর অংশ, যা ডেটা স্ট্রাকচারগুলি পরিচালনা করতে সাহায্য করে। Queue (প্রধানত FIFO বা First In, First Out) পদ্ধতির ওপর ভিত্তি করে কাজ করে, এবং Deque (ডাবল এন্ডেড কিউ) একটি আরও উন্নত ডেটা স্ট্রাকচার যা উপাদানগুলি উভয় প্রান্ত থেকে ইনসার্ট এবং রিমুভ করতে সক্ষম।
এই নিবন্ধে আমরা Queue এবং Deque ইন্টারফেসের মৌলিক ধারণা এবং PriorityQueue এবং LinkedList এর মাধ্যমে কিভাবে Queue ইন্টারফেসের সাথে ইন্টিগ্রেশন করা যায় তা নিয়ে আলোচনা করব।
1. Queue Interface: মৌলিক ধারণা
Queue ইন্টারফেসটি একটি FIFO ডেটা স্ট্রাকচার, অর্থাৎ প্রথমে প্রবেশ করা উপাদানটি প্রথমে বের করা হবে। এটি সাধারণত line বা queue এর মতো কাজ করে, যেখানে প্রথমে আসা ব্যক্তি (অথবা উপাদান) প্রথমে সেবা পায়।
Queue ইন্টারফেসের মূল বৈশিষ্ট্যগুলি:
- FIFO Order: প্রথমে আসা উপাদানটি প্রথমে বের করা হয়।
- Insertion and Deletion: কেবল এক প্রান্তে উপাদান যোগ করা হয় (enqueue) এবং অন্য প্রান্তে উপাদান সরানো হয় (dequeue)।
Queue Interface এর গুরুত্বপূর্ণ মেথডসমূহ:
- add(E e): কিউতে একটি উপাদান যুক্ত করে। যদি কিউ ফুল থাকে তবে এটি
IllegalStateExceptionতৈরি করবে। - offer(E e): কিউতে একটি উপাদান যুক্ত করার চেষ্টা করে, যদি কিউ পূর্ণ থাকে, তবে এটি false ফেরত দেয়।
- remove(): কিউ থেকে প্রথম উপাদান সরিয়ে দেয়। যদি কিউ খালি থাকে, তবে এটি
NoSuchElementExceptionতৈরি করবে। - poll(): কিউ থেকে প্রথম উপাদান সরিয়ে দেয়, তবে কিউ খালি থাকলে এটি null ফেরত দেয়।
- peek(): কিউয়ের প্রথম উপাদানটিকে পরীক্ষা করে, কিন্তু সরায় না। কিউ খালি থাকলে এটি null ফেরত দেয়।
2. Deque Interface: ডাবল-এন্ডেড কিউ
Deque (Double Ended Queue) একটি ডেটা স্ট্রাকচার যা উপাদানগুলি উভয় প্রান্ত থেকে ইনসার্ট এবং রিমুভ করার অনুমতি দেয়। এটি FIFO বা LIFO (Last In, First Out) উভয় ধরনের অপারেশন সাপোর্ট করতে পারে, যা Queue এর চেয়ে আরও নমনীয়।
Deque এর মূল বৈশিষ্ট্য:
- এটি একটি Queue যা প্রথম এবং শেষ প্রান্ত থেকে উপাদান পরিচালনা করতে সহায়ক।
- এর মধ্যে push() এবং pop() মেথডগুলো stack এর মতো কাজ করে, তবে addFirst(), removeFirst(), addLast(), এবং removeLast() এর মাধ্যমে উভয় প্রান্তে উপাদান অ্যাক্সেস করা যায়।
3. PriorityQueue: Queue এর সাথে Integration
PriorityQueue হল একটি queue যা প্রাধান্য অনুযায়ী উপাদানগুলোকে সাজানোর জন্য ব্যবহৃত হয়। এটি একটি heap-based ডেটা স্ট্রাকচার এবং এর মধ্যে উপাদানগুলি priority অনুসারে সজ্জিত হয়।
PriorityQueue এর মূল বৈশিষ্ট্য:
- এটি natural ordering বা custom comparator দ্বারা উপাদানগুলিকে সাজায়।
- এটি FIFO অনুসরণ করে, তবে উপাদানগুলি priority অনুসারে বের হয়, তাই উচ্চ প্রাধান্য সম্পন্ন উপাদানগুলি আগে বের হবে।
PriorityQueue Example:
import java.util.PriorityQueue;
public class PriorityQueueExample {
public static void main(String[] args) {
// Create a PriorityQueue
PriorityQueue<Integer> queue = new PriorityQueue<>();
// Add elements to the queue
queue.add(10);
queue.add(20);
queue.add(15);
// Removing elements according to their priority (ascending order)
System.out.println("PriorityQueue Elements:");
while (!queue.isEmpty()) {
System.out.println(queue.poll()); // Elements are removed in ascending order
}
}
}
Output:
PriorityQueue Elements:
10
15
20
ব্যাখ্যা:
PriorityQueueকিউতেadd()মেথড দ্বারা উপাদান যোগ করা হয়। উপাদানগুলো স্বয়ংক্রিয়ভাবে প্রাধান্য অনুযায়ী সাজানো হয় এবংpoll()মেথডের মাধ্যমে priority অনুসারে উপাদান বের করা হয়।
4. LinkedList: Queue এর সাথে Integration
LinkedList ক্লাসটি Queue ইন্টারফেসের একটি বাস্তবায়ন যা FIFO ভিত্তিক কিউ পরিচালনা করতে ব্যবহৃত হয়। LinkedList একটি double-linked list এবং এতে ইনসার্শন, রিমুভাল ইত্যাদি অপারেশনগুলিতে দ্রুত গতিতে কাজ করা যায়।
LinkedList as Queue Example:
import java.util.LinkedList;
import java.util.Queue;
public class LinkedListQueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
// Add elements to the queue
queue.add("Java");
queue.add("Python");
queue.add("JavaScript");
// Remove elements from the queue
System.out.println("Queue Elements:");
while (!queue.isEmpty()) {
System.out.println(queue.poll()); // Removes elements from the front
}
}
}
Output:
Queue Elements:
Java
Python
JavaScript
ব্যাখ্যা:
LinkedListএকটি queue হিসেবে ব্যবহৃত হয়েছে, যেখানেadd()মেথড দিয়ে উপাদান যোগ করা হচ্ছে এবংpoll()মেথডের মাধ্যমে FIFO পদ্ধতিতে উপাদানগুলো সরানো হচ্ছে।
Queue এবং Deque এর ব্যবহার ও সুবিধা:
- Queue (PriorityQueue) ব্যবহার:
- Task Scheduling: বিভিন্ন অ্যাপ্লিকেশন যেমন job scheduling বা task scheduling-এ priority queue ব্যবহার করা হয়, যেখানে কাজের প্রাধান্য অনুসারে তা সম্পাদন করা হয়।
- Event Handling: ইভেন্ট সিস্টেমে যেখানে ইভেন্টগুলিকে প্রাধান্য দিয়ে সরানো হয়, সেখানে PriorityQueue ব্যবহৃত হতে পারে।
- Deque ব্যবহার:
- Stack/Queue Implementation: Deque ব্যবহৃত হয় যখন একটি ডেটা স্ট্রাকচার উভয় প্রান্তে ইনসার্ট এবং রিমুভ করতে হয়, যেমন stack বা queue।
- Undo-Redo Operation: Deque-এর সাহায্যে undo/redo অপারেশন তৈরি করা যায়, যেখানে পুরনো এবং নতুন অবস্থা উভয় প্রান্ত থেকে বের করা হয়।
- Queue এবং Deque ইন্টারফেস FIFO বা LIFO ভিত্তিক অপারেশন পরিচালনা করতে ব্যবহৃত হয়।
- PriorityQueue কিউটি priority অনুসারে উপাদান সরানোর জন্য ব্যবহৃত হয়, যা হিপ-ভিত্তিক ডেটা স্ট্রাকচার।
- LinkedList কিউ ব্যবহারে অত্যন্ত কার্যকর, যেহেতু এটি দ্রুত ইনসার্শন এবং রিমুভাল অপারেশন সম্পাদন করতে সক্ষম।
- Queue এবং Deque ইন্টারফেসগুলির মাধ্যমে FIFO, LIFO, এবং priority-based অপারেশনগুলি খুব সহজে এবং দক্ষতার সাথে পরিচালনা করা যায়, যা অনেক ধরনের অ্যাপ্লিকেশনে ব্যবহারযোগ্য।
Deque (Double-ended Queue) হল Java Collections Framework এর একটি ইন্টারফেস, যা java.util প্যাকেজে উপলব্ধ। এটি Queue ইন্টারফেসের একটি উন্নত সংস্করণ এবং একটি double-ended queue এর বৈশিষ্ট্য সরবরাহ করে, যার মানে হলো আপনি queue এর উভয় প্রান্ত (front এবং back) থেকে উপাদান যুক্ত বা মুছে ফেলতে পারেন।
Deque এর প্রধান বৈশিষ্ট্য:
- Double-ended Queue: Deque এর মাধ্যমে আপনি queue এর প্রথম এবং শেষ থেকে ডেটা যোগ বা মুছে ফেলতে পারেন, যা সাধারণ Queue ইন্টারফেসের থেকে উন্নত বৈশিষ্ট্য।
- FIFO এবং LIFO সমর্থন করে: Deque একই সঙ্গে FIFO (First-In-First-Out) এবং LIFO (Last-In-First-Out) উভয় পদ্ধতিতে কাজ করতে পারে, যেমন stack এবং queue এর মতো।
- Efficient Operations: Deque এর উপর বিভিন্ন অপারেশন যেমন addFirst(), addLast(), removeFirst(), removeLast() দ্রুত সম্পাদন করা সম্ভব।
- No Blocking: Deque একাধিক উপাদান একই সঙ্গে ব্যবহারের জন্য নিরাপদ এবং কোন ব্লকিং অপারেশন নেই।
Deque Interface এর প্রধান ক্লাসসমূহ:
- ArrayDeque:
ArrayDequeহল একটি resizable array যা Deque ইন্টারফেসের একটি বাস্তবায়ন। এটিLinkedListএর তুলনায় কিছু ক্ষেত্রে দ্রুত হতে পারে, বিশেষ করে যখন আপনাকে queue এবং stack উভয় ধরনের অপারেশন করতে হয়।- এটি সাধারণত ব্যবহৃত হয় যখন FIFO বা LIFO অপারেশন করা প্রয়োজন এবং তার সাথে ডাবল এন্ডেড অপারেশন করা যায়।
- LinkedList:
LinkedListহল Deque ইন্টারফেসের আরেকটি বাস্তবায়ন। এটি একটি ডাবল লিঙ্কড লিস্ট ভিত্তিক ডেটা স্ট্রাকচার এবং queue এবং stack উভয় ধরনের কার্যাবলী সমর্থন করে।
Deque Interface এর প্রধান মেথডসমূহ:
Deque ইন্টারফেসে কিছু গুরুত্বপূর্ণ মেথড রয়েছে যা আপনি queue এর উভয় প্রান্তে অপারেশন করতে ব্যবহার করতে পারেন:
- addFirst(E e):
- একটি উপাদানকে Deque এর প্রথম প্রান্তে যোগ করে।
- addLast(E e):
- একটি উপাদানকে Deque এর শেষ প্রান্তে যোগ করে।
- removeFirst():
- Deque এর প্রথম প্রান্ত থেকে একটি উপাদান মুছে ফেলে।
- removeLast():
- Deque এর শেষ প্রান্ত থেকে একটি উপাদান মুছে ফেলে।
- getFirst():
- Deque এর প্রথম উপাদানটি ফেরত দেয় (এটি কোন উপাদান মুছে না ফেলে)।
- getLast():
- Deque এর শেষ উপাদানটি ফেরত দেয় (এটি কোন উপাদান মুছে না ফেলে)।
- offerFirst(E e):
- একটি উপাদানকে প্রথম প্রান্তে যুক্ত করার চেষ্টা করে এবং সফল হলে true ফেরত দেয়।
- offerLast(E e):
- একটি উপাদানকে শেষ প্রান্তে যুক্ত করার চেষ্টা করে এবং সফল হলে true ফেরত দেয়।
- pollFirst():
- Deque এর প্রথম উপাদানটি মুছে ফেলে এবং ফেরত দেয়, যদি Deque খালি না থাকে।
- pollLast():
- Deque এর শেষ উপাদানটি মুছে ফেলে এবং ফেরত দেয়, যদি Deque খালি না থাকে।
Deque ব্যবহার করার উদাহরণ:
1. ArrayDeque উদাহরণ:
import java.util.ArrayDeque;
import java.util.Deque;
public class ArrayDequeExample {
public static void main(String[] args) {
// Creating a Deque using ArrayDeque
Deque<String> deque = new ArrayDeque<>();
// Adding elements to the Deque
deque.addFirst("Apple");
deque.addLast("Banana");
deque.addFirst("Orange");
// Displaying the Deque
System.out.println("Deque: " + deque); // Output: [Orange, Apple, Banana]
// Removing elements from the Deque
System.out.println("Removed first: " + deque.removeFirst()); // Output: Orange
System.out.println("Removed last: " + deque.removeLast()); // Output: Banana
// Displaying the Deque after removal
System.out.println("Deque after removal: " + deque); // Output: [Apple]
}
}
Output:
Deque: [Orange, Apple, Banana]
Removed first: Orange
Removed last: Banana
Deque after removal: [Apple]
ব্যাখ্যা:
addFirst("Apple")এবংaddLast("Banana")মেথড ব্যবহার করে উপাদানগুলো প্রথম এবং শেষ প্রান্তে যোগ করা হয়েছে।- পরে
removeFirst()এবংremoveLast()মেথড ব্যবহার করে প্রথম এবং শেষ প্রান্ত থেকে উপাদানগুলি মুছে ফেলা হয়েছে।
2. LinkedList উদাহরণ:
import java.util.Deque;
import java.util.LinkedList;
public class LinkedListDequeExample {
public static void main(String[] args) {
// Creating a Deque using LinkedList
Deque<String> deque = new LinkedList<>();
// Adding elements to the Deque
deque.offerFirst("Java");
deque.offerLast("Python");
deque.offerFirst("C++");
// Displaying the Deque
System.out.println("Deque: " + deque); // Output: [C++, Java, Python]
// Removing elements from the Deque
System.out.println("Removed first: " + deque.pollFirst()); // Output: C++
System.out.println("Removed last: " + deque.pollLast()); // Output: Python
// Displaying the Deque after removal
System.out.println("Deque after removal: " + deque); // Output: [Java]
}
}
Output:
Deque: [C++, Java, Python]
Removed first: C++
Removed last: Python
Deque after removal: [Java]
ব্যাখ্যা:
offerFirst("Java"),offerLast("Python")ব্যবহার করে উপাদানগুলো first এবং last প্রান্তে যোগ করা হয়েছে।pollFirst()এবংpollLast()মেথড ব্যবহার করে উপাদানগুলো প্রথম এবং শেষ প্রান্ত থেকে মুছে ফেলা হয়েছে।
Deque এর ব্যবহারিক ক্ষেত্রে উদাহরণ:
- Task Scheduling (Queue):
- Deque একটি কার্যকরী queue হিসাবে কাজ করতে পারে যেখানে আপনি FIFO (First In First Out) পদ্ধতিতে কাজ করতে পারেন। তবে আপনি LIFO (Last In First Out) পদ্ধতিতেও কাজ করতে পারবেন, যেমন একটি stack।
- Palindrome Checking:
- একটি Deque এর সাহায্যে আপনি Palindrome যাচাই করতে পারেন। যেহেতু এটি উভয় প্রান্ত থেকে উপাদান মুছে ফেলতে সহায়তা করে, আপনি একটি শব্দের প্রথম এবং শেষ অক্ষর তুলনা করতে পারবেন।
- Undo/Redo Operations:
- আপনি Deque ব্যবহার করতে পারেন Undo এবং Redo অপারেশনগুলো পরিচালনা করতে। addFirst() দিয়ে undo স্ট্যাক তৈরি এবং addLast() দিয়ে redo স্ট্যাক তৈরি করা যেতে পারে।
Deque এর সুবিধা:
- Efficient Operations: Deque দ্রুততম সময়ে উপাদান যোগ এবং মুছে ফেলতে সক্ষম, বিশেষ করে যখন আপনি প্রথম এবং শেষ প্রান্তে কাজ করছেন।
- FIFO এবং LIFO সমর্থন: একই ক্লাসে আপনি queue (FIFO) এবং stack (LIFO) উভয় প্রকারের কার্যাবলী পরিচালনা করতে পারেন।
- Thread-Safety (Concurrent Deque):
ConcurrentLinkedDequeএবং অন্যান্য কনকারেন্ট ক্লাসগুলি Deque ইন্টারফেসের জন্য থ্রেড-সেফ সংস্করণ সরবরাহ করে, যা মাল্টি-থ্রেডেড প্রোগ্রামিং এর জন্য সহায়ক।
Deque ইন্টারফেস একটি শক্তিশালী ডেটা স্ট্রাকচার যা আপনাকে double-ended queue পরিচালনার সুবিধা প্রদান করে। এটি FIFO এবং LIFO উভয় প্রকারের কার্যাবলী পরিচালনা করতে সক্ষম এবং ArrayDeque, LinkedList ইত্যাদি ক্লাস দ্বারা বাস্তবায়িত হয়। Deque এর কার্যকারিতা এবং বিভিন্ন অপারেশন যেমন addFirst(), addLast(), removeFirst(), removeLast() দ্রুত এবং দক্ষভাবে সম্পাদিত হয়।
Queue ইন্টারফেসটি Java Collections Framework-এর অংশ এবং এটি FIFO (First In First Out) অর্ডারে উপাদানগুলি সংরক্ষণ করে। Queue সাধারণত একটি ডেটা স্ট্রাকচার হিসেবে ব্যবহৃত হয় যেখানে insertions (আইটেম যোগ করা) এক প্রান্তে এবং deletions (আইটেম মুছে ফেলা) অন্য প্রান্তে ঘটে। Queue ইন্টারফেসের মধ্যে অনেক গুরুত্বপূর্ণ মেথড রয়েছে, যেগুলোর মধ্যে offer(), poll(), এবং peek() মেথডগুলি অত্যন্ত গুরুত্বপূর্ণ।
এই মেথডগুলির মধ্যে পার্থক্য এবং ব্যবহার সম্পর্কে বিস্তারিত আলোচনা করা হবে।
1. offer() Method
offer() মেথডটি Queue-এর শেষে একটি উপাদান যোগ করার জন্য ব্যবহৃত হয়। এটি একটি boolean মান রিটার্ন করে:
true: যদি উপাদানটি সফলভাবে Queue-এ যোগ করা হয়।false: যদি উপাদানটি যোগ করা না যায় (যেমন যদি Queue পূর্ণ থাকে এবং এটি সীমানা নির্ধারিত হয়)।
Syntax:
boolean offer(E e);
E: যে উপাদানটি যোগ করা হবে।
Example:
import java.util.LinkedList;
import java.util.Queue;
public class OfferMethodExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
// Adding elements to the Queue using offer()
queue.offer("Java");
queue.offer("Python");
queue.offer("JavaScript");
// Printing the Queue
System.out.println("Queue: " + queue);
}
}
Output:
Queue: [Java, Python, JavaScript]
ব্যাখ্যা:
offer()মেথডটি Queue-এর শেষে উপাদান যোগ করেছে। এটিLinkedListদ্বারা বাস্তবায়িত Queue-এ কাজ করেছে, যেখানে উপাদানগুলো FIFO (First In First Out) অর্ডারে যোগ হচ্ছে।
2. poll() Method
poll() মেথডটি Queue থেকে প্রথম উপাদান (প্রথমে যোগ করা উপাদান) মুছে ফেলে এবং সেটি রিটার্ন করে। এটি null রিটার্ন করতে পারে যদি Queue খালি থাকে।
Syntax:
E poll();
E: মুছে ফেলা উপাদানটি।
Example:
import java.util.LinkedList;
import java.util.Queue;
public class PollMethodExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
// Adding elements to the Queue
queue.offer("Java");
queue.offer("Python");
queue.offer("JavaScript");
// Removing elements from the Queue using poll()
String removedElement = queue.poll();
System.out.println("Removed Element: " + removedElement);
// Printing the Queue after removal
System.out.println("Queue after poll: " + queue);
}
}
Output:
Removed Element: Java
Queue after poll: [Python, JavaScript]
ব্যাখ্যা:
poll()মেথডটি প্রথম উপাদান "Java" মুছে ফেলেছে এবং এটি রিটার্ন করেছে। এরপরQueueথেকে বাকি উপাদানগুলো "Python" এবং "JavaScript" অবশিষ্ট রয়েছে।
3. peek() Method
peek() মেথডটি Queue এর প্রথম উপাদানটি read-onlyভাবে ফেরত দেয়, অর্থাৎ এটি শুধুমাত্র প্রথম উপাদানটি দেখে এবং মুছে ফেলে না। যদি Queue খালি থাকে, তবে এটি null রিটার্ন করে।
Syntax:
E peek();
E: প্রথম উপাদানটি, যা মুছে ফেলা হয়নি।
Example:
import java.util.LinkedList;
import java.util.Queue;
public class PeekMethodExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
// Adding elements to the Queue
queue.offer("Java");
queue.offer("Python");
queue.offer("JavaScript");
// Viewing the first element using peek()
String firstElement = queue.peek();
System.out.println("First Element: " + firstElement);
// Printing the Queue after peek
System.out.println("Queue after peek: " + queue);
}
}
Output:
First Element: Java
Queue after peek: [Java, Python, JavaScript]
ব্যাখ্যা:
peek()মেথডটি প্রথম উপাদান "Java" দেখিয়েছে, কিন্তু এটি Queue থেকে মুছে ফেলেনি। তাই Queue এর অবস্থা অপরিবর্তিত রয়েছে এবং বাকি উপাদানগুলো একই থাকে।
offer(), poll(), এবং peek() এর মধ্যে পার্থক্য:
| Method | Description | Return Value | When to Use |
|---|---|---|---|
offer() | Adds an element to the queue. | true if added, false if not added. | Use when you want to add an element to the queue. |
poll() | Removes and returns the head element of the queue. | The head element or null if the queue is empty. | Use when you want to remove and return the first element. |
peek() | Returns but does not remove the head element of the queue. | The head element or null if the queue is empty. | Use when you want to check the first element without removing it. |
Use Cases:
- offer():
offer()ব্যবহার করুন যখন আপনি Queue তে নতুন উপাদান যোগ করতে চান, এবং এটি যদি পূর্ণ হয়, তবে একটিfalseরিটার্ন হবে, যা সেই অবস্থায় একটি বিশেষ ব্যবস্থা নেয়ার সুযোগ দেয়।
- poll():
poll()ব্যবহার করুন যখন আপনি Queue থেকে প্রথম উপাদানটি মুছে ফেলতে চান এবং যদি এটি খালি হয়, তখনnullরিটার্ন হবে, এটি যাচাই করার সুবিধা প্রদান করে।
- peek():
peek()ব্যবহার করুন যখন আপনি Queue এর প্রথম উপাদানটি দেখতে চান, কিন্তু এটি মুছে ফেলতে চান না, এবং খালি হলেnullরিটার্ন হবে।
offer()মেথডটি একটি উপাদান Queue-এ যোগ করার জন্য ব্যবহৃত হয় এবং এটি boolean রিটার্ন করে।poll()মেথডটি প্রথম উপাদান Queue থেকে মুছে ফেলে এবং এটি রিটার্ন করে। যদি Queue খালি থাকে, তবেnullরিটার্ন করবে।peek()মেথডটি প্রথম উপাদানটি দেখানোর জন্য ব্যবহৃত হয়, তবে এটি মুছে ফেলে না এবং খালি হলেnullরিটার্ন করে।
এগুলি Queue ইন্টারফেসের কিছু গুরুত্বপূর্ণ মেথড, যা FIFO অর্ডারে উপাদান অ্যাক্সেস ও পরিচালনার জন্য ব্যবহৃত হয়।
Read more