في هذه المقالة، سنناقش قائمة الانتظار ذات النهاية المزدوجة أو deque. يجب أن نرى أولاً وصفًا موجزًا لقائمة الانتظار.
ما هي قائمة الانتظار؟
قائمة الانتظار عبارة عن بنية بيانات يتم فيها إخراج كل ما يأتي أولاً أولاً، ويتبع سياسة FIFO (أولاً يدخل أولاً يخرج أولاً). يتم الإدراج في قائمة الانتظار من طرف واحد يعرف باسم نهاية الطريق أو ال ذيل، بينما يتم الحذف من طرف آخر يعرف باسم نهاية المقدمة أو ال رأس من قائمة الانتظار.
اجتياز أمر بريد الشجرة الثنائية
المثال الواقعي لقائمة الانتظار هو قائمة انتظار التذاكر خارج قاعة السينما، حيث يحصل الشخص الذي يدخل أولاً في قائمة الانتظار على التذكرة أولاً، والشخص الذي يدخل آخر قائمة الانتظار يحصل على التذكرة أخيرًا.
ما هو Deque (أو قائمة الانتظار ذات النهاية المزدوجة)
يرمز deque إلى Double Ended Queue. Deque عبارة عن بنية بيانات خطية حيث يتم تنفيذ عمليات الإدراج والحذف من كلا الطرفين. يمكننا القول أن deque هي نسخة عامة من قائمة الانتظار.
على الرغم من إمكانية إجراء الإدراج والحذف في مجموعة deque على كلا الطرفين، إلا أنها لا تتبع قاعدة FIFO. يتم إعطاء تمثيل deque على النحو التالي -
أنواع ديك
هناك نوعان من deque -
- قائمة انتظار الإدخال المقيدة
- قائمة انتظار الإخراج المقيدة
قائمة انتظار الإدخال المقيدة
في قائمة انتظار الإدخال المقيدة، يمكن إجراء عملية الإدراج في نهاية واحدة فقط، بينما يمكن إجراء الحذف من كلا الطرفين.
قائمة انتظار الإخراج المقيدة
في قائمة انتظار الإخراج المقيدة، يمكن إجراء عملية الحذف من طرف واحد فقط، بينما يمكن إجراء عملية الإدراج من كلا الطرفين.
العمليات التي تتم على deque
هناك العمليات التالية التي يمكن تطبيقها على deque -
- الإدراج في الجبهة
- الإدراج في الخلف
- الحذف في المقدمة
- الحذف في الخلف
يمكننا أيضًا إجراء عمليات نظرة خاطفة في deque جنبًا إلى جنب مع العمليات المذكورة أعلاه. من خلال عملية نظرة خاطفة، يمكننا الحصول على العناصر الأمامية والخلفية لل deque. لذلك، بالإضافة إلى العمليات المذكورة أعلاه، يتم أيضًا دعم العمليات التالية في deque -
موقع df
- احصل على العنصر الأمامي من deque
- احصل على العنصر الخلفي من deque
- تحقق مما إذا كان deque ممتلئًا أم لا
- يتحقق مما إذا كان deque فارغًا أم لا
الآن، دعونا نفهم العملية التي تم إجراؤها على deque باستخدام مثال.
الإدراج في الواجهة الأمامية
في هذه العملية، يتم إدراج العنصر من الواجهة الأمامية لقائمة الانتظار. قبل تنفيذ العملية، علينا أولاً التحقق مما إذا كانت قائمة الانتظار ممتلئة أم لا. إذا لم تكن قائمة الانتظار ممتلئة، فيمكن إدراج العنصر من الواجهة الأمامية باستخدام الشروط التالية -
- إذا كانت قائمة الانتظار فارغة، فسيتم تهيئة كل من الجزء الخلفي والأمامي بالقيمة 0. والآن، سيشير كلاهما إلى العنصر الأول.
- بخلاف ذلك، تحقق من موضع الجزء الأمامي إذا كان الجزء الأمامي أقل من 1 (أمامي<1), then reinitialize it by front = n - 1، أي الفهرس الأخير للمصفوفة.1),>
الإدراج في النهاية الخلفية
في هذه العملية، يتم إدراج العنصر من النهاية الخلفية لقائمة الانتظار. قبل تنفيذ العملية، علينا أولاً التحقق مرة أخرى مما إذا كانت قائمة الانتظار ممتلئة أم لا. إذا لم تكن قائمة الانتظار ممتلئة، فيمكن إدخال العنصر من الطرف الخلفي باستخدام الشروط التالية -
- إذا كانت قائمة الانتظار فارغة، فسيتم تهيئة كل من الجزء الخلفي والأمامي بالقيمة 0. والآن، سيشير كلاهما إلى العنصر الأول.
- بخلاف ذلك، قم بزيادة الجزء الخلفي بمقدار 1. إذا كان الجزء الخلفي عند المؤشر الأخير (أو الحجم - 1)، فبدلاً من زيادته بمقدار 1، يتعين علينا جعله يساوي 0.
الحذف في الواجهة الأمامية
تم إنشاء مثيل لجافا
في هذه العملية، يتم حذف العنصر من الواجهة الأمامية لقائمة الانتظار. قبل تنفيذ العملية، علينا أولاً التحقق مما إذا كانت قائمة الانتظار فارغة أم لا.
إذا كانت قائمة الانتظار فارغة، أي الواجهة = -1، فهذه حالة التجاوز، ولا يمكننا إجراء الحذف. إذا لم تكن قائمة الانتظار ممتلئة، فيمكن إدراج العنصر من الواجهة الأمامية باستخدام الشروط التالية -
إذا كان deque يحتوي على عنصر واحد فقط، فاضبط الخلفية = -1 والأمامية = -1.
وإلا إذا كانت الجبهة في النهاية (وهذا يعني الجبهة = الحجم - 1)، تعيين الجبهة = 0.
مؤشر الرجوع ج
وإلا قم بزيادة المقدمة بمقدار 1، (أي الجبهة = الأمامية + 1).
الحذف في النهاية الخلفية
في هذه العملية، يتم حذف العنصر من النهاية الخلفية لقائمة الانتظار. قبل تنفيذ العملية، علينا أولاً التحقق مما إذا كانت قائمة الانتظار فارغة أم لا.
إذا كانت قائمة الانتظار فارغة، أي الواجهة = -1، فهذه حالة التجاوز، ولا يمكننا إجراء الحذف.
إذا كان deque يحتوي على عنصر واحد فقط، فاضبط الخلفية = -1 والأمامية = -1.
إذا كان الخلف = 0 (الخلف في الأمام)، فاضبط الخلف = n - 1.
بخلاف ذلك، قم بتقليل الجزء الخلفي بمقدار 1 (أو، الجزء الخلفي = الجزء الخلفي -1).
تحقق فارغة
يتم تنفيذ هذه العملية للتحقق مما إذا كان deque فارغًا أم لا. إذا كانت الواجهة = -1، فهذا يعني أن deque فارغ.
تحقق بالكامل
يتم تنفيذ هذه العملية للتحقق مما إذا كان deque ممتلئًا أم لا. إذا كانت الأمامية = الخلفية + 1، أو الأمامية = 0 والخلفية = n - 1 فهذا يعني أن deque ممتلئ.
التعقيد الزمني لجميع العمليات المذكورة أعلاه هو O(1)، أي ثابت.
تطبيقات ديك
- يمكن استخدام Deque كقائمة انتظار ومكدس، لأنه يدعم كلتا العمليتين.
- يمكن استخدام Deque كمدقق متناظر، مما يعني أنه إذا قرأنا السلسلة من كلا الطرفين، فستكون السلسلة هي نفسها.
تنفيذ ديك
الآن، دعونا نرى تنفيذ deque في لغة البرمجة C.
جافا شار إلى عدد صحيح
#include #define size 5 int deque[size]; int f = -1, r = -1; // insert_front function will insert the value from the front void insert_front(int x) { if((f==0 && r==size-1) || (f==r+1)) { printf('Overflow'); } else if((f==-1) && (r==-1)) { f=r=0; deque[f]=x; } else if(f==0) { f=size-1; deque[f]=x; } else { f=f-1; deque[f]=x; } } // insert_rear function will insert the value from the rear void insert_rear(int x) { if((f==0 && r==size-1) || (f==r+1)) { printf('Overflow'); } else if((f==-1) && (r==-1)) { r=0; deque[r]=x; } else if(r==size-1) { r=0; deque[r]=x; } else { r++; deque[r]=x; } } // display function prints all the value of deque. void display() { int i=f; printf(' Elements in a deque are: '); while(i!=r) { printf('%d ',deque[i]); i=(i+1)%size; } printf('%d',deque[r]); } // getfront function retrieves the first value of the deque. void getfront() { if((f==-1) && (r==-1)) { printf('Deque is empty'); } else { printf(' The value of the element at front is: %d', deque[f]); } } // getrear function retrieves the last value of the deque. void getrear() { if((f==-1) && (r==-1)) { printf('Deque is empty'); } else { printf(' The value of the element at rear is %d', deque[r]); } } // delete_front() function deletes the element from the front void delete_front() { if((f==-1) && (r==-1)) { printf('Deque is empty'); } else if(f==r) { printf(' The deleted element is %d', deque[f]); f=-1; r=-1; } else if(f==(size-1)) { printf(' The deleted element is %d', deque[f]); f=0; } else { printf(' The deleted element is %d', deque[f]); f=f+1; } } // delete_rear() function deletes the element from the rear void delete_rear() { if((f==-1) && (r==-1)) { printf('Deque is empty'); } else if(f==r) { printf(' The deleted element is %d', deque[r]); f=-1; r=-1; } else if(r==0) { printf(' The deleted element is %d', deque[r]); r=size-1; } else { printf(' The deleted element is %d', deque[r]); r=r-1; } } int main() { insert_front(20); insert_front(10); insert_rear(30); insert_rear(50); insert_rear(80); display(); // Calling the display function to retrieve the values of deque getfront(); // Retrieve the value at front-end getrear(); // Retrieve the value at rear-end delete_front(); delete_rear(); display(); // calling display function to retrieve values after deletion return 0; }
انتاج:
لذلك، هذا كل ما في هذه المادة. نأمل أن تكون المقالة مفيدة وغنية بالمعلومات لك.