قائمة الانتظار هي نوع آخر من بنية البيانات الخطية التي يتم استخدامها لتخزين العناصر تمامًا مثل أي بنية بيانات أخرى ولكن بطريقة معينة. بكلمات بسيطة، يمكننا القول أن قائمة الانتظار هي نوع من بنية البيانات في لغة برمجة جافا التي تخزن عناصر من نفس النوع. يتم تخزين المكونات الموجودة في قائمة الانتظار في سلوك FIFO (الداخل أولاً يخرج أولاً). هناك طرفان في مجموعة قائمة الانتظار، أي الأمامي والخلفي. قائمة الانتظار لها طرفان أمامي وخلفي.
يصف الشكل التالي بشكل مثالي خاصية FIFO (الداخل أولاً، يخرج أولاً) لقائمة انتظار Java.
كما هو موضح في الصورة السابقة، يمكننا أن نرى أن قائمة الانتظار عبارة عن بنية بيانات خطية ذات طرفين، أي البداية (الأمامية) والنهاية (الخلفية). تتم إضافة المكونات داخل قائمة الانتظار من الطرف الخلفي لقائمة الانتظار ويتم استخراج المكونات من الطرف الأمامي لقائمة الانتظار.
مامتا كولكارني الممثل
قائمة الانتظار هي واجهة في جافا الذي ينتمي إلى حزمة Java.util . كما أنه يمتد واجهة المجموعة .
يظهر أدناه التمثيل العام لواجهة Java Queue:
public interface Queue extends Collection
كما ناقشنا أعلاه أن قائمة الانتظار عبارة عن واجهة، لذلك يمكننا أيضًا أن نقول أنه لا يمكن إنشاء مثيل لقائمة الانتظار لأنه لا يمكن إنشاء مثيل للواجهات. إذا أراد المستخدم تنفيذ وظيفة واجهة قائمة الانتظار في Java، فمن الضروري أن يكون لديه بعض الفئات الصلبة التي تنفذ واجهة قائمة الانتظار.
في لغة برمجة Java، هناك فئتان مختلفتان يتم استخدامهما لتنفيذ واجهة قائمة الانتظار. هذه الفئات هي:
خصائص قائمة انتظار جافا
يمكن اعتبار Java Queue أحد أهم هياكل البيانات في عالم البرمجة. تعتبر Java Queue جذابة بسبب خصائصها. يتم إعطاء الخصائص المهمة لبنية بيانات Java Queue كما يلي:
- تتبع قائمة انتظار Java طريقة FIFO (الداخل أولاً، يخرج أولاً). يشير إلى أنه تم إدخال العناصر في قائمة الانتظار في النهاية وإزالتها من المقدمة.
- توفر واجهة Java Queue جميع القواعد والعمليات الخاصة بواجهة المجموعة مثل التضمين والحذف وما إلى ذلك.
- هناك فئتان مختلفتان يتم استخدامهما لتنفيذ واجهة قائمة الانتظار. هذه الفئات هي LinkedList وPriorityQueue.
- بخلاف هذين، هناك فئة وهي Array Blocking Queue التي يتم استخدامها لتنفيذ واجهة قائمة الانتظار.
- هناك نوعان من قوائم الانتظار، قوائم الانتظار غير المحدودة وقوائم الانتظار المحدودة. تُعرف قوائم الانتظار التي تشكل جزءًا من الحزمة java.util باسم قوائم الانتظار غير المحدودة وقوائم الانتظار المحدودة هي قوائم الانتظار الموجودة في الحزمة java.util.concurrent.
- إن Deque أو (قائمة الانتظار ذات النهاية المزدوجة) هي أيضًا نوع من قوائم الانتظار التي تحمل إدراج وحذف العناصر من كلا الطرفين.
- يعتبر deque أيضًا آمنًا للخيط.
- تعد قوائم الانتظار المحظورة أيضًا أحد أنواع قوائم الانتظار الآمنة أيضًا. يتم استخدام قوائم الانتظار المحظورة لتنفيذ استعلامات المنتج والمستهلك.
- لا تدعم قوائم الانتظار المحظورة العناصر الفارغة. في حظر قوائم الانتظار، إذا تمت تجربة أي عمل مشابه للقيم الخالية، فسيتم طرح NullPointerException أيضًا.
تنفيذ قائمة الانتظار
الفئات المستخدمة في تنفيذ قائمة الانتظار
يتم إعطاء الفئات المستخدمة لتنفيذ وظائف قائمة الانتظار على النحو التالي:
جافا لين من المصفوفة
الواجهات المستخدمة في تنفيذ قائمة الانتظار
تُستخدم واجهات Java أيضًا في تنفيذ قائمة انتظار Java. يتم إعطاء الواجهات المستخدمة لتنفيذ وظائف قائمة الانتظار على النحو التالي:
- من ماذا
- حظر قائمة الانتظار
- حجب ديك
أساليب فئة قائمة الانتظار جافا
هناك العديد من الطرق المستخدمة بشكل شائع في قائمة انتظار Java. تعمل واجهة قائمة الانتظار على تعزيز أساليب مختلفة مثل الإدراج والحذف والنظرة الخاطفة وما إلى ذلك. بعض عمليات قائمة انتظار Java تثير استثناءً بينما تقوم بعض هذه العمليات بإرجاع قيمة معينة عند اكتمال البرنامج.
ملاحظة - في Java SE 8، لم يتم إجراء أي تغييرات في مجموعة قائمة انتظار Java. يتم إعداد هذه الأساليب التي تم تعريفها أدناه بشكل أكبر في الإصدارات اللاحقة من لغة برمجة Java. على سبيل المثال، جافا SE 9.
يتم تحديد الطرق المختلفة لقائمة انتظار Java أدناه:
طريقة | النموذج الأولي للطريقة | وصف |
---|---|---|
يضيف | إضافة منطقية (E e) | يضيف العنصر e إلى قائمة الانتظار في نهاية (ذيل) قائمة الانتظار دون انتهاك القيود المفروضة على السعة. يُرجع صحيحًا في حالة النجاح أو IllegalStateException في حالة استنفاد السعة. |
نظرة خاطفة | نظرة خاطفة () | إرجاع رأس قائمة الانتظار (الأمامي) دون إزالته. |
عنصر | العنصر الإلكتروني () | ينفذ نفس العملية مثل طريقة النظرة الخاطفة (). يرمي NoSuchElementException عندما تكون قائمة الانتظار فارغة. |
يزيل | إزالة () | يزيل رأس قائمة الانتظار ويعيده. يرمي NoSuchElementException إذا كانت قائمة الانتظار فارغة. |
تصويت | الاستطلاع الإلكتروني() | يزيل رأس قائمة الانتظار ويعيده. إذا كانت قائمة الانتظار فارغة، فإنها ترجع فارغة. |
يعرض | العرض المنطقي (E e) | أدخل العنصر الجديد e في قائمة الانتظار دون انتهاك قيود السعة. |
مقاس | حجم صحيح () | إرجاع حجم أو عدد العناصر في قائمة الانتظار. |
تنفيذ مصفوفة انتظار جافا
تنفيذ قائمة الانتظار ليس سهلاً مثل تنفيذ المكدس.
لتنفيذ قائمة الانتظار باستخدام المصفوفات، نعلن أولاً عن مصفوفة تحتوي على عدد n من العناصر.
ثم نحدد العمليات التالية التي سيتم تنفيذها في قائمة الانتظار هذه.
1) قائمة الانتظار: عملية إدراج عنصر في قائمة الانتظار هي Enqueue (قائمة انتظار الوظائف Enqueue في البرنامج). لإدراج عنصر في النهاية الخلفية، نحتاج أولاً إلى التحقق مما إذا كانت قائمة الانتظار ممتلئة. إذا كان ممتلئا، فلن نتمكن من إدراج العنصر. إذا الخلفي 2) الذيل: عملية حذف عنصر من قائمة الانتظار هي Dequeue (قائمة انتظار الوظائف Dequeue في البرنامج). أولاً، نتحقق مما إذا كانت قائمة الانتظار فارغة. لكي تعمل عملية dequeue، يجب أن يكون هناك عنصر واحد على الأقل في قائمة الانتظار. 3) الجبهة: تقوم هذه الطريقة بإرجاع مقدمة قائمة الانتظار. 4) العرض: تجتاز هذه الطريقة قائمة الانتظار وتعرض عناصر قائمة الانتظار. يوضح برنامج Java التالي تنفيذ قائمة الانتظار. QueueArrayImplementation.java نظرًا لأننا قمنا بتنفيذ بنية بيانات قائمة الانتظار باستخدام المصفوفات في البرنامج أعلاه، فيمكننا أيضًا تنفيذ قائمة الانتظار باستخدام القائمة المرتبطة. سوف نقوم بتنفيذ نفس الأساليب في هذا البرنامج مثل: enqueue، وdequeue، وfront، وdisplay. الفرق هو أننا سنستخدم بنية بيانات القائمة المرتبطة بدلاً من المصفوفة. يوضح البرنامج أدناه تنفيذ القائمة المرتبطة لقائمة الانتظار في Java. QueueLLImplementation.java انتاج: الكود الرمادي
برنامج جافا لقائمة الانتظار
جدول desc في MySQL
class Queue { private static int front, rear, capacity; private static int queue[]; Queue(int size) { front = rear = 0; capacity = size; queue = new int[capacity]; } // insert an element into the queue static void queueEnqueue(int item) { // check if the queue is full if (capacity == rear) { System.out.printf('
Queue is full
'); return; } // insert element at the rear else { queue[rear] = item; rear++; } return; } //remove an element from the queue static void queueDequeue() { // check if queue is empty if (front == rear) { System.out.printf('
Queue is empty
'); return; } // shift elements to the right by one place uptil rear else { for (int i = 0; i <rear 0 4 - 1; i++) { queue[i]="queue[i" + 1]; } set queue[rear] to if (rear < capacity) decrement rear rear--; return; print queue elements static void queuedisplay() int i; (front="=" rear) system.out.printf('queue is empty
'); traverse front and for (i="front;" i rear; system.out.printf(' %d , ', queue[i]); of queuefront() system.out.printf('
front element the queue: %d', queue[front]); public class queuearrayimplementation main(string[] args) create a capacity q="new" queue(4); system.out.println('initial queue:'); q.queuedisplay(); inserting in q.queueenqueue(10); q.queueenqueue(30); q.queueenqueue(50); q.queueenqueue(70); system.out.println('queue after enqueue operation:'); q.queuefront(); insert q.queueenqueue(90); q.queuedequeue(); system.out.printf('
queue two dequeue operations:'); pre> <p> <strong>Output:</strong> </p> <pre> Initial Queue: Queue is Empty Queue after Enqueue Operation: 10 , 30 , 50 , 70 , Front Element of the queue: 10 Queue is full 10 , 30 , 50 , 70 , Queue after two dequeue operations: 50 , 70 , Front Element of the queue: 50 </pre> <h2>Java Queue Linked List Implementation</h2> <p>As we have implemented the Queue data structure using Arrays in the above program, we can also implement the Queue using Linked List.</p> <p>We will implement the same methods enqueue, dequeue, front, and display in this program. The difference is that we will be using the Linked List data structure instead of Array.</p> <p>The below program demonstrates the Linked List implementation of Queue in Java.</p> <p> <strong>QueueLLImplementation.java</strong> </p> <pre> class LinkedListQueue { private Node front, rear; private int queueSize; // queue size //linked list node private class Node { int data; Node next; } //default constructor - initially front & rear are null; size=0; queue is empty public LinkedListQueue() { front = null; rear = null; queueSize = 0; } //check if the queue is empty public boolean isEmpty() { return (queueSize == 0); } //Remove item from the front of the queue. public int dequeue() { int data = front.data; front = front.next; if (isEmpty()) { rear = null; } queueSize--; System.out.println('Element ' + data+ ' removed from the queue'); return data; } //Add data at the rear of the queue. public void enqueue(int data) { Node oldRear = rear; rear = new Node(); rear.data = data; rear.next = null; if (isEmpty()) { front = rear; } else { oldRear.next = rear; } queueSize++; System.out.println('Element ' + data+ ' added to the queue'); } //print front and rear of the queue public void print_frontRear() { System.out.println('Front of the queue:' + front.data + ' Rear of the queue:' + rear.data); } } class QueueLLImplementation{ public static void main(String a[]){ LinkedListQueue queue = new LinkedListQueue(); queue.enqueue(6); queue.enqueue(3); queue.print_frontRear(); queue.enqueue(12); queue.enqueue(24); queue.dequeue(); queue.dequeue(); queue.enqueue(9); queue.print_frontRear(); } } </pre> <p> <strong>Output:</strong> </p> <pre> Element 6 added to the queue Element 3 added to the queue Front of the queue:6 Rear of the queue:3 Element 12 added to the queue Element 24 added to the queue Element 6 removed from the queue Element 3 removed from the queue Element 9 added to the queue Front of the queue:12 Rear of the queue:9 </pre> <hr></rear>
تنفيذ قائمة انتظار جافا المرتبطة
class LinkedListQueue { private Node front, rear; private int queueSize; // queue size //linked list node private class Node { int data; Node next; } //default constructor - initially front & rear are null; size=0; queue is empty public LinkedListQueue() { front = null; rear = null; queueSize = 0; } //check if the queue is empty public boolean isEmpty() { return (queueSize == 0); } //Remove item from the front of the queue. public int dequeue() { int data = front.data; front = front.next; if (isEmpty()) { rear = null; } queueSize--; System.out.println('Element ' + data+ ' removed from the queue'); return data; } //Add data at the rear of the queue. public void enqueue(int data) { Node oldRear = rear; rear = new Node(); rear.data = data; rear.next = null; if (isEmpty()) { front = rear; } else { oldRear.next = rear; } queueSize++; System.out.println('Element ' + data+ ' added to the queue'); } //print front and rear of the queue public void print_frontRear() { System.out.println('Front of the queue:' + front.data + ' Rear of the queue:' + rear.data); } } class QueueLLImplementation{ public static void main(String a[]){ LinkedListQueue queue = new LinkedListQueue(); queue.enqueue(6); queue.enqueue(3); queue.print_frontRear(); queue.enqueue(12); queue.enqueue(24); queue.dequeue(); queue.dequeue(); queue.enqueue(9); queue.print_frontRear(); } }
Element 6 added to the queue Element 3 added to the queue Front of the queue:6 Rear of the queue:3 Element 12 added to the queue Element 24 added to the queue Element 6 removed from the queue Element 3 removed from the queue Element 9 added to the queue Front of the queue:12 Rear of the queue:9