هياكل بيانات محاضره 5 PDF

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

‫مميزات الطابور الدائري‪:‬‬

‫الطابور الدائري يسمح لكامل المصفوفة بخزن العناصر دون الحاجة الى تزحيف البيانات ضمن الطابور‪.‬‬

‫المصفوفة بالطابور الدائري تلتف حول نفسها مما يجعل مؤشر النهاية يتجاور مع مؤشر البداية ‪,‬هذا‬

‫يساعد على الوصول الى اول او اخر عنصر بشكل كفوء ‪.‬بعد عملية الحذف فان المكان الفارغ في‬

‫المصفوفة ممكن ان نستفيد منه لخزن اي عنصر جديد‪.‬‬

‫في الطابور الخطي فان العناصر من الممكن ان تحشر او تضاف وذلك بزيادة مؤشر النهاية ‪,‬وعندما‬

‫يصل مؤشر النهاية الى الحجم االكبر وحتى وان تم حذف عناصر من مقدمة الطابور فان الطابور يعتبر‬

‫مألن ‪.‬لذلك في الطابور الخطي اليمكن االستفادة من المصفوفة بشكل كامل ‪.‬من جانب اخر ‪,‬في الطابور‬

‫الدائري فان مؤشر البداية يتجاور مع مؤشر النهاية وعليه فان الطابور الدائري يسمح لكامل المصفوفة‬

‫لخزن العناصر ‪.‬الفائدة االساسية للطابور الدائري على الطابور الخطي هو امكانية استخدام فضاء‬

‫المصفوفة بشكل اكفأ‪.‬‬

‫خوارزمية اضافة عنصر الى الطابور الدائري‪:‬‬

‫‪.1‬تبدأ بفحص مؤشر البداية والنهاية لمعرفة وضعية الطابور‬

‫)‪ if (front = = (rear+1) % max‬اذا كانت هذه العالقة صحيحة فان ذلك يعني ان الطابور ممتليء واليوجد‬
‫فيه فراغ ‪,‬لذلك‬

‫‪ - A‬يتم طباعة رسالة خطأ تشير الى امتالء الطابور‬

‫‪ - B‬الخروج من دالة االضافة‬

‫‪.2‬اذا كانت العبارة في ‪ 1‬خاطئة ففي هذة الحالة يتم اضافة واحد الى مؤشر النهاية لتغيير موقعه‬

‫‪rear = (rear+1) % max‬‬

‫‪.3‬اضافة العنصر الجديد في الموقع الذي يؤشر عليه مؤشر النهاية‬

‫;‪Q[rear] = element‬‬

‫‪.4‬فحص مؤشر البداية فيما اذا كان في موقع ‪, 1-‬اي ان الطابور فارغ ‪,‬عندها تغير قيمة المؤشر وذلك باضافة‬
‫واحد الى مؤشر البداية ومؤشر النهاية‬

‫;‪If (front == -1 ) front = 0; rear = 0‬‬

‫خوارزمية حذف عنصر من الطابور الدائري‪:‬‬

‫‪.1‬بداية يتم فحص مؤشري البداية والنهاية فاذا كانت قيمة المؤشران تساوي )‪ (-1‬فان ذلك يعني ان الطابور‬
‫فارغ وبالتالي اليمكن حذف عنصر من طابور فارغ‬
‫))‪if ((front == rear) && (rear == -1‬‬

‫‪ - A‬في هذه الحالة يتم طباعة رسالة خطأ للداللة على ان الطابور فارغ‬

‫‪ - B‬الخروج من دالة الحذف‬

‫‪.2‬في خالف ذلك ‪,‬اي اذا كان الطابور ليس بفارغ بمعنى ان العبارة في ‪ 1‬خاطئة ‪..‬عندها يتم حذف العنصر‬
‫الذي يؤشر علية مؤشر البداية‬

‫]‪element = Q[front‬‬

‫‪.3‬يتم تغيير قيمة مؤشرالبداية وذلك بزيادتها بواحد ‪..‬هنا حالتين‬

‫‪ - A‬اما ان يكون مؤشري البداية والنهاية متساويين عندها يتم مساواتهم للصفر ) هذا يعني ان الطابور يحتوي‬
‫على عنصر واحد فقط(‬

‫‪If (front == rear) front=rear = -1‬‬

‫‪ - B‬اما اذا كان العبارة في )‪ (A‬خاطئة اي ان الطابور يحتوي على اكثر من عنصر واحد عندها يضاف واحد‬
‫الى مؤشر البداية كما في ادناه‬

‫‪front = (front + 1) % max‬‬

‫مثال‪:‬‬

‫بداية فان مؤشر البداية ومؤشر النهاية قيمتهم )‪ (-1‬اي ان الطابور فارغ‬

‫بدءا فان الطابور خالي ولذلك سنعمل على اضافة العناصر التالية ‪60 – 40 – 20‬‬

‫اضافة العنصرين ‪ 50‬و ‪ 10‬الى الطابور‬


‫االن لنجرب اضافة عنصر اخر ليكن ‪ 32‬الى الطابور الدائري‪.‬‬ ‫‪-‬‬

‫اوال نستخدام العالقة التالية) للتاكد من وجود فراغ(‬

‫))‪If ( front == ((rear +1) % size‬‬

‫‪Front = 0‬‬

‫‪(Rear + 1) % size = (4+1) % 5 = 0‬‬

‫العالقة اعاله صحيحة ‪,‬وهذا يعني ان الطابور ممتليءلذلك اليمكن اإلضافة‬

‫االن لنحذف عنصر‬ ‫‪-‬‬

‫اوال نتاكد من وجود عناصر وذلك باستخدام العالقة التالية‬

‫)‪If (Front == Rear) && (Rear = -1‬‬

‫هنا يكون الطابور فارغ اذا كانت هذه العبارة صحيحة‬

‫اما اذا لم تكن صحيحة فهذا يعني وجود عناصر في الطابور اي الطابور ليس فارغ‪.‬‬

‫في هذه الحالة فان )‪ (front = 0 && rear = 4‬اي غير متساويين) يعني العبارة خاطئة(‬

‫هنا يتم زيادة مؤشر البداية وبذلك فان العنصر الذي كان يؤشر عليه مؤشر البداية يتم حذفه وكمايلي‬

‫‪Front = (Front + 1) % size‬‬

‫‪= (0 + 1) % 5‬‬

‫‪=1%5‬‬

‫‪Front = 1‬‬
‫لنحذف عنصر اخر نتبع نفس الطريقة‬

‫‪Front = ( Front + 1) % size‬‬

‫‪= (1 +1 ) % 5‬‬

‫‪=2%5‬‬

‫‪=2‬‬

‫الطوابير مع األولوية (‪: )Priority Queues‬‬

‫هي امتداد للطوابير مع الخصائص التالية‪:‬‬

‫‪ -‬كل عنصر له أولوية مرتبطة به‪.‬‬


‫‪ -‬يتم إزالة عنصر ذي أولوية عالية قبل عنصر ذي أولوية منخفضة‪.‬‬
‫‪ -‬إذا كان للعنصرين نفس األولوية ‪ ،‬فسيتم التعامل معهما وفقًا لترتيبهما في الطابور‪.‬‬
‫في الطابور التالي ‪ ،‬سيكون للعنصر ذي القيمة االكبر في الترميز ‪ ASCII‬األولوية العليا‪.‬‬
.‫الطوابير ذات االولويات تدعم العمليات التالية‬
.‫ إدراج عنصر مع إعطاءه أولوية‬- insert(item, priority)
.‫ إرجاع العنصر ذي األولوية العليا‬- getHighestPriority()
. ‫ حذف عنصر ذي األولوية العليا‬- deleteHighestPriority()

STL ‫ باستخدام‬Priority Queue ‫ مثال على استخدام‬-


#include <iostream>
#include <queue>

using namespace std;

void showpq(priority_queue <int> gq)


{
priority_queue <int> g = gq;
while (!g.empty())
{
cout << '\t' << g.top();
g.pop();
}
cout << '\n';
}

int main ()
{
priority_queue <int> gquiz;
gquiz.push(10);
gquiz.push(30);
gquiz.push(20);
gquiz.push(5);
gquiz.push(1);

cout << "The priority queue gquiz is : ";


showpq(gquiz);

cout << "\ngquiz.size() : " << gquiz.size();


cout << "\ngquiz.top() : " << gquiz.top();
‫;" ‪cout << "\ngquiz.pop() :‬‬
‫;)(‪gquiz.pop‬‬
‫;)‪showpq(gquiz‬‬

‫;‪return 0‬‬
‫}‬
‫من األمثلة على استخدام الطوابير ذات األولويات ‪:‬‬
‫محاكاة لحركة الطائرات في المطار ‪:‬‬

‫المتطلبات‪:‬‬
‫‪ -‬يتم استخدام نفس المدرج لكل من عمليات الهبوط واإلقالع‪.‬‬
‫‪ -‬تستطيع طائرة واحدة الهبوط أو اإلقالع في وحدة زمنية ‪ ،‬لكن ليس االثنين معا‪.‬‬
‫‪ -‬يصل عدد معين من الطائرات في كل وحدة زمنية‪.‬‬
‫‪ -‬الطائرة التي تنتظر الهبوط تستخدم المدرج قبل الطائرات التي تنتظر االقالع‪.‬‬
‫‪ -‬يتم ادراج الطائرات التي تنتظر الهبوط واإلقالع في قوائم االنتظار (الطابور ‪) Queue‬‬
‫وصف المحاكاة ‪:‬‬
‫الكائنات (‪ )Classes‬الالزمة لعملية المحاكاة ‪:‬‬
‫‪• Runway class‬‬
‫العناصر –‬
‫قائمة انتظار الهبوط ‪ ،‬قائمة انتظار اإلقالع والمتغيرات األخرى •‬
‫حالة المدرج –‬
‫•‬ ‫الخمول ‪ ،‬الهبوط ‪ ،‬اإلقالع‬
‫‪• Plane_status class‬‬
‫وضع الطائرة –‬
‫مغادرة ‪,‬وصول ‪• null,‬‬
‫‪• Initialization‬‬
‫–‬ ‫يحدد عدد الوحدات الزمنية في المحاكاة ‪ ،‬وأحجام قائمة االنتظار القصوى المسموح بها ‪،‬‬
‫ومعدالت الوصول والمغادرة المتوقعة للمطار‬

You might also like