عمليات Deque: المكدس والطابور
استخدم LinkedList بوصفها Deque لتطبيق سلوك المكدس (push/pop) والطابور (offer/poll)
عمليات Deque: المكدس والطابور درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
Deque: طابور ذو طرفين
تتيح Deque (الطابور ذو الطرفين) عمليات الإدراج والإزالة عند كلا الطرفين. وتطبّق واجهة Deque في Java كل من LinkedList وArrayDeque.
import java.util.Deque;
import java.util.ArrayDeque;
Deque<String> deque = new ArrayDeque<>();
deque.addFirst("A"); // front
deque.addLast("B"); // back
deque.addFirst("Z"); // new front
System.out.println(deque); // [Z, A, B]ArrayDeque أم LinkedList باعتبارهما Deque
يُفضَّل عمومًا استخدام ArrayDeque بدلًا من LinkedList باعتبارهما Deque:
- لا توجد كلفة عقدة لكل عنصر
- استفادة أفضل من موقع البيانات في الذاكرة المؤقتة
- أسرع قليلًا في عمليات المكدس والطابور
اختر LinkedList فقط عندما تحتاج أيضًا إلى واجهة List.
عمليات المكدس باستخدام Deque
استخدم push (addFirst) وpop (removeFirst) لمحاكاة مكدس LIFO. وتجنب الفئة القديمة Stack؛ فهي متزامنة ومتقادمة.
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.pop()); // 3
System.out.println(stack.peek()); // 2 (no removal)
System.out.println(stack.pop()); // 2عمليات الطابور باستخدام Deque
استخدم offer (addLast) وpoll (removeFirst) لمحاكاة طابور FIFO. تُرجع offer القيمة false عند الفشل، بينما ترمي add استثناءً.
Deque<String> queue = new ArrayDeque<>();
queue.offer("task1");
queue.offer("task2");
queue.offer("task3");
System.out.println(queue.poll()); // task1
System.out.println(queue.poll()); // task2
System.out.println(queue.size()); // 1جدول مرجعي لأساليب Deque
توفّر Deque مجموعتين من الأساليب: مجموعة ترمي استثناءات، وأخرى تُرجع قيمًا خاصة:
- addFirst/addLast مقابل offerFirst/offerLast
- removeFirst/removeLast مقابل pollFirst/pollLast
- getFirst/getLast مقابل peekFirst/peekLast
فضّل مجموعة offer/poll/peek لتجنب الاستثناءات عند فراغ Deque.
مثال عملي: التراجع والإعادة باستخدام مكدسين
من حالات الاستخدام الكلاسيكية لـ Deque: يكون سجل التراجع مكدسًا، وتكون الإعادة مكدسًا آخر.
Deque<String> undo = new ArrayDeque<>();
Deque<String> redo = new ArrayDeque<>();
undo.push("type 'Hello'");
undo.push("type ' World'");
String action = undo.pop();
System.out.println("Undone: " + action); // type ' World'
redo.push(action);
System.out.println("Redo top: " + redo.peek()); // type ' World'التحقق من Palindrome باستخدام Deque
تجعل Deque عملية التحقق من Palindrome أنيقة، إذ تقارن الأحرف من الطرفين في الوقت نفسه.
Deque<Character> deque = new ArrayDeque<>();
for (char c : "racecar".toCharArray()) deque.add(c);
boolean isPalindrome = true;
while (deque.size() > 1) {
if (!deque.pollFirst().equals(deque.pollLast())) {
isPalindrome = false;
break;
}
}
System.out.println(isPalindrome); // trueBFS باستخدام طابور
يستخدم البحث بعرض الشجرة طابورًا. وتُعد ArrayDeque الخيار القياسي لـ BFS في البرمجة التنافسية واجتياز الرسوم البيانية.
import java.util.*;
// BFS on a simple adjacency list
Map<Integer,List<Integer>> graph = Map.of(
1, List.of(2,3),
2, List.of(4),
3, List.of(4),
4, List.of()
);
Deque<Integer> queue = new ArrayDeque<>();
Set<Integer> visited = new HashSet<>();
queue.offer(1);
while (!queue.isEmpty()) {
int node = queue.poll();
if (visited.add(node)) {
System.out.print(node + " ");
queue.addAll(graph.get(node));
}
}DFS باستخدام مكدس
يستخدم البحث بعمق الشجرة مكدسًا. ومرة أخرى، فضّل ArrayDeque على الفئة القديمة Stack.
Deque<Integer> stack = new ArrayDeque<>();
Set<Integer> visited = new HashSet<>();
stack.push(1);
while (!stack.isEmpty()) {
int node = stack.pop();
if (visited.add(node)) {
System.out.print(node + " ");
// push neighbors (will be processed in reverse order)
List<Integer> neighbors = List.of(2, 3); // simplified
for (int n : neighbors) if (!visited.contains(n)) stack.push(n);
}
}Deque محدودة مع التحقق من الحجم
تنمو ArrayDeque ديناميكيًا، ولكن يمكنك فرض سعة يدويًا لمحاكاة مخزن مؤقت محدود:
Deque<Integer> buffer = new ArrayDeque<>();
int MAX = 3;
for (int i = 1; i <= 5; i++) {
if (buffer.size() >= MAX) {
buffer.pollFirst(); // drop oldest
}
buffer.offerLast(i);
}
System.out.println(buffer); // [3, 4, 5]ملاحظات حول الأداء
تستخدم ArrayDeque مصفوفة دائرية تتضاعف عند امتلائها. وتبلغ الكلفة المتوسطة لجميع العمليات O(1). وهي تتفوق على LinkedList في معظم الاختبارات المعيارية بفضل كفاءة ذاكرة التخزين المؤقت. لا تزامنها يدويًا مطلقًا، بل استخدم ConcurrentLinkedDeque أو طابورًا حاجزًا للتعامل مع التزامن.
اختبار سريع
أي فئة ينبغي أن تفضّلها على Stack القديمة لتنفيذ عمليات LIFO؟
خلاصة: عمليات Deque
أهم النقاط:
- تتيح Deque عمليات الإدراج والإزالة بتعقيد O(1) عند كلا الطرفين
- تُفضَّل ArrayDeque على LinkedList عند استخدامها كمكدس أو طابور فقط
- push/pop ← مكدس LIFO؛ وoffer/poll ← طابور FIFO
- الاستخدامات الكلاسيكية: التراجع/الإعادة، وBFS/DFS، والنافذة المنزلقة، والتحقق من Palindrome
- تجنب الفئتين القديمتين Stack وQueue
الأسئلة الشائعة
هل درس «عمليات Deque: المكدس والطابور» مجاني؟
نعم — نص درس «عمليات Deque: المكدس والطابور» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «عمليات Deque: المكدس والطابور»؟
استخدم LinkedList بوصفها Deque لتطبيق سلوك المكدس (push/pop) والطابور (offer/poll) تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «عمليات Deque: المكدس والطابور»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- البنية الداخلية لـ LinkedList
- عمليات Deque: المكدس والطابور
- المفاضلة بين LinkedList وArrayList
- PriorityQueue للمعالجة المرتبة