بنى المعطيات – الرَتل
Queue Data Structure
تعتبر الأرتال (Queues) أيضاً من بنى المعطيات الشهيرة , و خلافاً للمكدِّس فإن الأرتال تعتمد على المبدأ التالي :
(العنصر الذي يدخل أولاً يخرج أولاً) (First in frist out) , و لاستيعاب فكرة الرتل لن نحتاج لمثال بعيد عن متناولنا كثيراً , اذهب الآن لأي مركز خدمات أو حتّى فرن خبز
ستلاحظ وجود "طابور" أو رتل و بكل تأكيد يجب أن تقف آخر هذا الرتل ثم تنتظر دورك , الآن ما يحصل على هذا الطابور أو الرتل هو تماماً ما يحصل في بنية المعطيات هذه ; انظر الشكل :
ممتاز جدّاً , الآن في درس المكدَّس مثلنا المكدّس بالاعتماد على مصفوفة و استخدمنا متغيّراً ليدلنا على رقم العنصر العلوي من المكدّس , سنقوم بنفس الخطوات هنا تقريباً حيث سنمثّل الرتل بالاعتماد على مصفوفة و لكن سنستخدم متغيرين ليشير أحدهما إلى مقدمة أو الرتل (Front) و الآخر لذيل الرتل (Rear) .
بالتالي أصبح بامكاننا أن نكتب شيئاً قريباً مما يلي على افتراض أن الرتل سيحتوي عناصر من النوع Int و لن يزيد عددها عن 100 عنصر للسهولة .
كود
Int Queue[100];
Int front,rear;
هناك توابع للأرتال كما الحال مع المكدّسات و قد اصطلح المبرمجون تسميتها كما يلي :
Queue_init : تهيئة الرتل الجديد .
In_Queue : إضافة عنصر جديد للرتل .
Empty : للتحقق هل الرتل فارغ أم لا .
De_queue : لحذف آوّل عنصر من الرتل (رأس الرتل) .
Front : دالة تعيد أول عنصر من الرتل (رأس الرتل) .
بناء الدالة الأولى – دالة تهيئة الرتل :
لتهيئة الرتل أو تفريغه بمعنى آخر يكفي أن نجعل قيمة كل من rear و Front مساويةً لـ -1 مما يعني أنّه لا عناصر في الرتل ; انظر الشكل
و بالتالي أصبح يمكن كتابة هذه الدالة كما يلي :
كود
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];
}
كما قلت في نهاية درس المكدِّس سأقول في نهاية هذا الدرس , هذه مجرّد أفكار سريعة بالإمكان التطوير عليها بشكل كبير حيث أنها تهدف للتعليم و ليست احترافية بما فيه الكفاية لجعلك تعتمد هذه البنية بشكل نهائي , بالإمكان أيضاً بناء صف خاص يستخدم هذه الطرق و يتعامل مع الذاكرة بشكل ديناميكي لتحصل على بنية تستعملها لاحقاً في مشاريعك و تكون مستفيداً من كل ميزات البرمجة غرضية التوجه .
تم بحمد الله
لا تنسونا من صالح الدعاء
أخوكم :
مختار السيد صالح
Queue Data Structure
تعتبر الأرتال (Queues) أيضاً من بنى المعطيات الشهيرة , و خلافاً للمكدِّس فإن الأرتال تعتمد على المبدأ التالي :
(العنصر الذي يدخل أولاً يخرج أولاً) (First in frist out) , و لاستيعاب فكرة الرتل لن نحتاج لمثال بعيد عن متناولنا كثيراً , اذهب الآن لأي مركز خدمات أو حتّى فرن خبز
ستلاحظ وجود "طابور" أو رتل و بكل تأكيد يجب أن تقف آخر هذا الرتل ثم تنتظر دورك , الآن ما يحصل على هذا الطابور أو الرتل هو تماماً ما يحصل في بنية المعطيات هذه ; انظر الشكل :
ممتاز جدّاً , الآن في درس المكدَّس مثلنا المكدّس بالاعتماد على مصفوفة و استخدمنا متغيّراً ليدلنا على رقم العنصر العلوي من المكدّس , سنقوم بنفس الخطوات هنا تقريباً حيث سنمثّل الرتل بالاعتماد على مصفوفة و لكن سنستخدم متغيرين ليشير أحدهما إلى مقدمة أو الرتل (Front) و الآخر لذيل الرتل (Rear) .
بالتالي أصبح بامكاننا أن نكتب شيئاً قريباً مما يلي على افتراض أن الرتل سيحتوي عناصر من النوع Int و لن يزيد عددها عن 100 عنصر للسهولة .
كود
Int Queue[100];
Int front,rear;
هناك توابع للأرتال كما الحال مع المكدّسات و قد اصطلح المبرمجون تسميتها كما يلي :
Queue_init : تهيئة الرتل الجديد .
In_Queue : إضافة عنصر جديد للرتل .
Empty : للتحقق هل الرتل فارغ أم لا .
De_queue : لحذف آوّل عنصر من الرتل (رأس الرتل) .
Front : دالة تعيد أول عنصر من الرتل (رأس الرتل) .
بناء الدالة الأولى – دالة تهيئة الرتل :
لتهيئة الرتل أو تفريغه بمعنى آخر يكفي أن نجعل قيمة كل من rear و Front مساويةً لـ -1 مما يعني أنّه لا عناصر في الرتل ; انظر الشكل
و بالتالي أصبح يمكن كتابة هذه الدالة كما يلي :
كود
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];
}
كما قلت في نهاية درس المكدِّس سأقول في نهاية هذا الدرس , هذه مجرّد أفكار سريعة بالإمكان التطوير عليها بشكل كبير حيث أنها تهدف للتعليم و ليست احترافية بما فيه الكفاية لجعلك تعتمد هذه البنية بشكل نهائي , بالإمكان أيضاً بناء صف خاص يستخدم هذه الطرق و يتعامل مع الذاكرة بشكل ديناميكي لتحصل على بنية تستعملها لاحقاً في مشاريعك و تكون مستفيداً من كل ميزات البرمجة غرضية التوجه .
تم بحمد الله
لا تنسونا من صالح الدعاء
أخوكم :
مختار السيد صالح