الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

بُنى المعطيات - الرتل .

بدأه مختار سيد صالح في 25 مايو 2008 · 0 رد · 1,648 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#1

بنى المعطيات – الرَتل

Queue Data Structure

تعتبر الأرتال (Queues) أيضاً من بنى المعطيات الشهيرة , و خلافاً للمكدِّس فإن الأرتال تعتمد على المبدأ التالي :

(العنصر الذي يدخل أولاً يخرج أولاً) (First in frist out) , و لاستيعاب فكرة الرتل لن نحتاج لمثال بعيد عن متناولنا كثيراً , اذهب الآن لأي مركز خدمات أو حتّى فرن خبز

ستلاحظ وجود "طابور" أو رتل و بكل تأكيد يجب أن تقف آخر هذا الرتل ثم تنتظر دورك , الآن ما يحصل على هذا الطابور أو الرتل هو تماماً ما يحصل في بنية المعطيات هذه ; انظر الشكل :

Queue1.gif

ممتاز جدّاً , الآن في درس المكدَّس مثلنا المكدّس بالاعتماد على مصفوفة و استخدمنا متغيّراً ليدلنا على رقم العنصر العلوي من المكدّس , سنقوم بنفس الخطوات هنا تقريباً حيث سنمثّل الرتل بالاعتماد على مصفوفة و لكن سنستخدم متغيرين ليشير أحدهما إلى مقدمة أو الرتل (Front) و الآخر لذيل الرتل (Rear) .

بالتالي أصبح بامكاننا أن نكتب شيئاً قريباً مما يلي على افتراض أن الرتل سيحتوي عناصر من النوع Int و لن يزيد عددها عن 100 عنصر للسهولة .

Int Queue[100];
Int front,rear;

هناك توابع للأرتال كما الحال مع المكدّسات و قد اصطلح المبرمجون تسميتها كما يلي :

Queue_init : تهيئة الرتل الجديد .

In_Queue : إضافة عنصر جديد للرتل .

Empty : للتحقق هل الرتل فارغ أم لا .

De_queue : لحذف آوّل عنصر من الرتل (رأس الرتل) .

Front : دالة تعيد أول عنصر من الرتل (رأس الرتل) .

بناء الدالة الأولى – دالة تهيئة الرتل :

لتهيئة الرتل أو تفريغه بمعنى آخر يكفي أن نجعل قيمة كل من rear و Front مساويةً لـ -1 مما يعني أنّه لا عناصر في الرتل ; انظر الشكل

Queue2.gif

و بالتالي أصبح يمكن كتابة هذه الدالة كما يلي :

Void queue_init()
{
	Front=rear=-1;
}

بناء الدالة الثانية – إضافة عنصر جديد للرتل :

كي نتمكن من إضافة عنصر جديد إلى الرتل سنقوم بزيادة Front بمقدار 1 ثم نضع القيمة ضمن queue ذات الفهرس Front مع مراعات ألّا يتجاوز Front الحد الأعلى لعدد عناصر الرتل .

Void in_queue(int val)
{
If(front<100)
{
Fornt++;
Queue[front]=val;
}
}

بناء الدالة الثالثة – التحقق أن الرتل فارغ :

قلنا في الدالة الأولى أن الرتل يكون فارغ عندما Front=Rear = -1 و بالتالي يمكننا التحقق من هذا الشرط فقط كما يلي .

Bool empty()
{
return (front==1- && rear==-1);
}

الدالة الرابعة – حذف عنصر من الرتل :

لحذف عنصر من الرتل يكفي أن نزيد قيمة الـ Rear بمقدار 1 (حذف ذيل الرتل) أو أن نقوم بإنقاص قيمة الـ Front بمقدار 1(حذف رأس الرتل) طبعاً مع مراعاة الشروط في كل حالة, سأكتب دالة حذف الرأس كمثال

Void de_queue()
{
	If(front>rear)
		Front--;
}

الدالة الأخيرة – إعادة رأس الرتل :

بكل بساطة

Int front()
{
	Return queue[front];
}

كما قلت في نهاية درس المكدِّس سأقول في نهاية هذا الدرس , هذه مجرّد أفكار سريعة بالإمكان التطوير عليها بشكل كبير حيث أنها تهدف للتعليم و ليست احترافية بما فيه الكفاية لجعلك تعتمد هذه البنية بشكل نهائي , بالإمكان أيضاً بناء صف خاص يستخدم هذه الطرق و يتعامل مع الذاكرة بشكل ديناميكي لتحصل على بنية تستعملها لاحقاً في مشاريعك و تكون مستفيداً من كل ميزات البرمجة غرضية التوجه .

تم بحمد الله

لا تنسونا من صالح الدعاء

أخوكم :

مختار السيد صالح

مواضيع مشابهة