شرح مفهوم طابور الانتظار Queue وسلوك FIFO، مع توضيح عمليات الإضافة والحذف وتمثيله بالمصفوفة الدائرية لتجنب الإزاحة.
Key Takeaways
- الطابور يعتمد مبدأ FIFO، فالعنصر الأقدم هو الذي يخرج أولاً.
- المصفوفة العادية غير فعّالة للطابور بسبب الحاجة للإزاحة عند الحذف.
- المصفوفة الدائرية تحل مشكلة الإزاحة وتحافظ على كفاءة العمليات.
What the video covers
- مقدمة عن الجزء الثاني من اللاب الرابع الخاص بهياكل البيانات، ويتناول الطابور Queue وسلوكه.
- شرح مبدأ FIFO: أول عنصر يدخل هو أول عنصر يخرج، مقارنةً بالمكدس Stack الذي يعكس الترتيب.
- توضيح عمليات الطابور الأساسية: Enqueue للإضافة من الخلف وDequeue للحذف من الأمام.
- مثال تطبيقي بإدخال القيم 10 و20 و30 و40 وملاحظة ترتيب الخروج.
- تمثيل الطابور باستخدام المصفوفة مع مؤشري Front وRear، وعيوب الإزاحة Shift عند الحذف وتعقيدها O(N).
- تطوير الحل بالمصفوفة الدائرية Circular Array للاستفادة من الفراغات بعد الحذف دون إزاحة.
- شرح دوال الطابور المجردة مثل First وsize وisEmpty.
- ربط المفهوم بتطبيقات واقعية مثل طلبات خادم الويب وطوابير الطباعة.
- تحليل الحالات الحدية مثل امتلاء المصفوفة الدائرية وحساب الموقع باستخدام باقي القسمة.
- ملاحظات عملية حول كتابة المنطق البرمجي وأخطاء شائعة أثناء التنفيذ.
Full Transcript — Download SRT & Markdown
Speaker A
السلام عليكم، إن شاء الله راح نكمل الجزء الثاني من اللاب الرابع، راح نحكي فيه عن الكيو والسلوك الخاص فيها.
Speaker A
فيرست إن فيرست أوت اللي بنختصره بـ فيفو. على عكس الـ الستاك، الكيو أول عنصر بيدخل فيها هو أول عنصر بيطلع، تمام؟ نقدر نحكي إنه الستاك الـ الكيو كمفهوم، تمام؟ الـ الـ كأنها قناة مفتوحة من الجهتين، أول عنصر فيه بيدخل فيها هو أول عنصر
Speaker A
First In First Out، اللي بنختصره بـ FIFO. على عكس الستاك، الكيو أول عنصر بيدخل فيها هو أول عنصر بيطلع، تمام؟ نقدر نحكي إنه الكيو كمفهوم، تمام؟ كأنها قناة مفتوحة من الجهتين، أول عنصر فيها بيدخل هو أول عنصر بيطلع، تمام؟
Speaker A
أنا بدي أعمل إدخال داخل الكيو، لنفترض إنه أنا عندي كيو، وحكينا الكيو بمثلها بالآراي وبمثلها باللينكد ليست.
Speaker A
أول عنصر بيدخل فيها هو نفسه أول عنصر بيطلع. ما عدا هذا الكلام، إنه الكيو تعمل عملية Insert للآخر And the Back، وبتحذف من مين؟ من الفرونت. يعني أنا بدخل، تمام؟
Speaker A
تمام؟ وخليني أنا أشير عليه إنه هو الفرونت، بعد هيك بدي أروح أدخل عنصر ثاني وراه اللي هو بدي أدخل الـ 20، فالـ 10 راح تدخل للأمام والـ 20 هي اللي راح تصير على الفرونت.
Speaker A
لنفترض كالتالي: أول عملية إدخال، لو أنا بدي أعمل إدخال داخل الكيو. لنفترض إنه أنا عندي كيو، وحكينا الكيو بمثلها بالآراي وبمثلها بالـ Linked List.
Speaker A
وبضلني أعمله إزاحة معاه، لو أنا بدي أطلع منه، الـ 10 اللي دخلتها أول وحدة هي اللي بتطلع، وراها الـ 20 وهكذا. راح نفهم مفاهيم الفرونت والرير والرموز هاي الموضحين في الصورة، لكن اللي بدنا نفهمه الآن إنه الكيو هي السلوك تبعها فيرست إن
Speaker A
بدي أعمل إدخال للكيو. خليني أدخل مثلًا أولها. الأول عنصر اللي بدي أدخله مين؟ العشرة.
Speaker A
يعني اللي بي- اللي بيط- بيستنى وقت أطول هو ماله؟ بيغادر أول، بيغادر أسرع. هذا الكلام بنشوفه في الويب سيرفر ريكويست، في طلبات النت.
Speaker A
تمام؟ وخليني أشير عليه إنه هو الفرونت. بعد هيك بدي أروح أدخل عنصر ثاني وراه، اللي هو بدي أدخل الـ 20. فالـ 10 راح تدخل للأمام والـ 20 هي اللي راح تصير على الفرونت.
Speaker A
تمام؟ فأنا بدخل مثلًا عندي عناصر داخل الأراي. الصورة ال- الموضحة الآن، تمام؟ ب- فيها أنتم ملاحظين مؤشر رير و- و- والفرونت. الأمر دي كيو والأمر إن كيو، كل هي رح نوض- رح نوضحها. لكن العناصر بتغادر بنفس الترتيب، لكن
Speaker A
تمام؟ وأول عنصر راح يصير... هي راح تضل هي البعيدة، الرير، وهي مين؟ الفرونت، هو أول عنصر أنا بدخله.
Speaker A
تمام؟ رح يطلعوا 40 30 20 10. بمعنى إنه الستات بتعمل ريفيرس لل- لل- للعناصر.
Speaker A
وبضل أعمله إزاحة معاه. لو أنا بدي أطلع منه، الـ 10 اللي دخلتها أول وحدة هي اللي بتطلع، وراها الـ 20، وهكذا. راح نفهم مفاهيم الفرونت والرير والرموز هاي الموضحين في الصورة، لكن اللي بدنا نفهمه الآن إنه الكيو السلوك تبعها First In First Out، First In First Out، أول عنصر بيدخل هو أول عنصر بيطلع، يعني أول عنصر بينتظر أكثر وبيستنى أكثر. The element that has waited the longest.
Speaker A
رح تطلعهم 10 20 30 40. تمام؟ ال- ال- ال- الكيو كأبستراكت داتا تايب بتحتوي على هدول الفنكشن بشكل أساسي. الإن كيو بتاخذ إليمينت، بتعمل إضافة للإليمينت أت ذا باك. تمام؟ في آخر الأراي اللي هو أول شيء رح يطلعه.
Speaker A
يعني اللي بيستنى وقت أطول هو مين؟ بيغادر أول، بيغادر أسرع. هذا الكلام بنشوفه في Web Server Request، في طلبات النت.
Speaker A
والسايز والإمتي اللي هم بيرجعولي ال- الكيو ستيت. تمام؟ طيب، حكينا في البداية إنه إحنا بدنا نمثل الكيو عن عن أراي.
Speaker A
إيه، في الشبكات، في عملية الطباعة وغيرها. فأول أمر أنا بنفذه هو أول شغلة بعملها.
Speaker A
يعني أنا بقدر أحكي عنه الـ الـ كأنه هو الـ الهيد. تمام؟ والرّير هو أبعد عنصر، يعني بقدر أحكي عنه التيل مثلاً. أوضحهم.
Speaker A
تمام؟ فأنا بدخل مثلًا عندي عناصر داخل الآراي. الصورة الموضحة الآن، تمام؟ فيها أنتم ملاحظين مؤشر Rear والـ Front. الأمر دي كيو والأمر إن كيو، كل هي رح نوضحها. لكن العناصر بتغادر بنفس الترتيب.
Speaker A
الآن أنا في الأري، الفرونت المفترض أنه يبدأ من أندكس زيرو، فكل عملية دي كيو، عملية يعني أنا دخلت مثلاً في الأري كاملين، أنا صار في عندي أري كاملة، رحت عملت دي كيو، يعني أنا عملت حذف لعنصر من الكيو، تمام؟ بضطر إني أعمل شيفت لكل
Speaker A
لكن في الستاك، في اللاب، في الفيرست الأول من اللاب، حكينا إنه أنا حأدخلهم 10، 20، 30، 40. تمام؟ رح يطلعوا 40، 30، 20، 10. بمعنى إنه الستاك بتعمل Reverse للعناصر.
Speaker A
معقد، اللي هو بنسميه أو أوف إن، رح نتعرف عليه لقدام. فعشان هيك كان الحل أنه أنا أستخدم السيركولر كيو، بمعنى إني أنا أستخدم له السيركولر أري. لكن قبل ما نتعرف على السيركولر أري وكيف بدنا نمثل من خلالها السيركولر كيو، خلينا نشوف تمثيل بصري على
Speaker A
لكن الكيو، تمام؟ بتحافظ على العناصر تكون بنفس الترتيب. بتخلي العناصر يغادروا بنفس الترتيب اللي وصلوا فيه. أنا دخلتهم 10، 20، 30، 40.
Speaker A
لي مين؟ امم. الـ الريل اللي هو أبعد عنصر. خليني أعمل 10. خليني نعمل 10 إنكيو. بدي أعمل هلق أنا إدخال للعناصر. لاحظوا.
Speaker A
رح تطلعهم 10، 20، 30، 40. تمام؟ الكيو كـ Abstract Data Type بتحتوي على هدول الفنكشن بشكل أساسي. الـ Enqueue بتاخذ إليمنت، بتعمل إضافة للإليمنت At The Back. تمام؟ في آخر الآراي، اللي هو أول شيء رح يطلعه.
Speaker A
خليني إحنا نشوف كيف شغال. خليني أنا أضيف العناصر بشكل مبا- يعني بشكل أسرع شوية عشان نشوف باقي العناصر. اللي صار عندي زود. ها. نرجع نعمل إنكيو مرة ثالثة. بدي أضيف الـ 30. إنكيو.
Speaker A
الـ Dequeue اللي بتحذف العنصر وبترجع أول إيه، بتحذفه وبترجع أول عنصر. الـ First، بترجعلي أول عنصر بدون ما أحذفه.
Speaker A
خليني أعمل كمان إنكيو. خليني أدخل العناصر عشان نشوف الـ الأشياء المهمة اللي بتصير. بيدخل عندي الإندكس وبيزيد.
Speaker A
والـ Size والـ IsEmpty اللي هم بيرجعولي الكيو ستيت. تمام؟ طيب، حكينا في البداية إنه إحنا بدنا نمثل الكيو عن أراي.
Speaker A
هذه عملية الإدخال. لاحظتوا كيف. هلق أنا نشوف كيف عملية الـ الديكيو، عملية الحذف. لو أنا عملت ديكيو راح يروح للهيد، لأول عنصر. تمام؟ هي عملت ديكيو. راح يروح لأول الـ العنصر اللي كان موجود. يحذف القيمة ويزيد عنصر أو مؤشر الحذف. الموقع هنا أأكد عليكم إنه
Speaker A
لاحظنا إنه أنا مثلاً دخلت عناصر عادية، دخلت 10، 20، 30، 40، 50 وهكذا. بعدين رحت، طبعاً أنا في الأراي دائماً ببدأ الـ Index من صفر، فالـ Front اللي هو أول عنصر بيكون ببدأ من الـ Index صفر، الـ Front هو أول عنصر.
Speaker A
عملت كمان مرة دي كيو. بيروح لمكان الإندكس بيحذف العنصر وبيغير معدل مؤشر الحذف. الآن لاحظنا هنا إنه ما صار عملية شيفت.
Speaker A
يعني أنا بقدر أحكي عنه كأنه الـ Head. تمام؟ والـ Rear هو أبعد عنصر، يعني بقدر أحكي عنه الـ Tail مثلاً. أوضحهم.
Speaker A
كانت أنا عندي الأري كبيرة إني أنا أعمل إزاحة لكل العناصر في كل عنصر أنا رح أعمله حذف. فتم تطوير مفهوم ال- السيركيولر إيه السيركيولر أري.
Speaker A
أول عنصر دخلته 10، ثاني عنصر، ثالث عنصر، رابع عنصر. فالـ Front والـ Rear هما مؤشرات على أول عنصر وآخر عنصر.
Speaker A
أخلي العناصر كلهم ترجع للصفر. لكن هنا عشان هيك يعني كأنه أنا صار المؤشر تبعي بيبدأ من هذا ال- يعني هذا هو المؤشر صار أنا عندي ما بطل يبدأ من الصفر.
Speaker A
الآن أنا في الأراي، الـ Front المفترض أنه يبدأ من Index صفر، فكل عملية Dequeue، عملية يعني أنا دخلت مثلاً في الأراي كاملة، أنا صار في عندي أراي كاملة، رحت عملت Dequeue، يعني أنا عملت حذف لعنصر من الكيو، تمام؟ بضطر إني أعمل Shift لكل العناصر عشان أخلي الـ Front يضل صفر. صح؟ يعني أنا مثلاً عندي هنا أراي فيها كثير عناصر، عملت حذف لأول عنصرين عشان أرجع الـ Front للـ Index صفر، تمام؟ لازم أعمل Shift، وهذا الكلام بيخليني الـ Complexity تبعها في تنفيذ الوقت كبير، معقد، اللي هو بنسميه Big O of N، رح نتعرف عليه لقدام.
Speaker A
لو أنا بدي أعمل هلأ إضافة لعنصر، تمام؟ لو بدي أرجع أضيف العشرة، عملت إن كيو.
Speaker A
فعشان هيك كان الحل إنه أنا أستخدم الـ Circular Queue، بمعنى إني أستخدم له الـ Circular Array. لكن قبل ما نتعرف على الـ Circular Array وكيف بدنا نمثل من خلالها الـ Circular Queue، خلينا نشوف تمثيل بصري على الكيو.
Speaker A
هلأ. خليني أنا أضيف أفرجيكم إنه بيشتغل كمان، إن كيو، هلأ ضاف مين؟ ضاف في الصفر صار المكان التاني المفترض أنا أدخل فيه هو عندي الإندكس واحد، تمام؟ فهي فكرة مين؟ فكرة السيركولر أراي. لو بدي أحذف رح أحذف من من عند الإندكس رقم
Speaker A
بالآراي في البداية، إحنا حالياً نتعامل على الكيو بالآراي. أنا عندي هاي آراي. لاحظوا أنه الموقع اللي أنا بتعامل معاه في العرض البصري بيتعامل مع الـ Head والـ Tail، الـ Head اللي هو بيمثل لي الـ Front، والـ Tail اللي هو راح يمثل لي... الـ Rear، اللي هو أبعد عنصر.
Speaker A
رح يحذف مين؟ الـ 30 وأحد وأحددها. تمام؟ فهي فكرة مين؟ تمثيل الـ الكيوب بالسيركولر أراي. لأنه لو أنا طبقت الكيوب بالأراي العادية رح أضطر أعمل شيفت. فلا أنا ما بديش أنا أتعامل مع لينير أراي. لا، بدي أنا سيركولر الـ أراي
Speaker A
خليني أعمل 10. خليني نعمل 10 Enqueue. بدي أعمل هلق أنا إدخال للعناصر. لاحظوا.
Speaker A
فعشان هيك الـ الـ والكتاب كمان بيفرض إنه يكون الفرونت أو المؤشر الإندكس تبعي إف دائمًا بيكون إنه يتحرك مع الأراي. فأنا ما بديش إياه يتحرك. فرحت لجأت لمين؟ للـ الـ سيركولر كيو. رحت لـ لجأت للسيركولر كيو اللي أنا بمثلها بالسيركولر أراي.
Speaker A
الـ Tail الموجود عندي صفر. لاحظوا دخلت عنصر وزدت... زدت الـ Tail. هلق الـ Tail هو أنا بساعد الموقع بيستعمل مع مؤشرين: عنصر الـ Tail للإضافة، وعنصر الـ Head عشان أنا أحذف منه اللي هو دائمًا بيبدأ من صفر.
Speaker A
فأنا هي اللفة كلها بتعامل معها من خلال إشارة الموديولو، تمام؟ عشان أرجع أستخدمها. إذا فكرة السيركولر أراي لاحظنا في البداية إنه أنا عندي فرونت ورير.
Speaker A
خليني نشوف كيف شغال. خليني أضيف العناصر بشكل أسرع شوية عشان نشوف باقي العناصر. اللي صار عندي زود. ها. نرجع نعمل Enqueue مرة ثالثة. بدي أضيف الـ 30. Enqueue.
Speaker A
لأنه خلص الرير هو وصل لآخر عنصر. لكن في السيركولر أراي بدي أخلي الرير يلف للعنصر الفاضي ويضيف لي العنصر فيه.
Speaker A
الـ Tail عند اثنين. المؤشر بيروح بيضيف الـ 30، بعدين بيحدث قيمة المؤشر اللي أنا بتعامل معها.
Speaker A
إشارة باقي القسمة. رح نتعرف كيف رح تصير هاي العملية. فأنا كان عندي الفرونت 10 تمام؟ الأندكس هاي البداية اللي هو الصفر تبعي عند الصفر. بدي أضيف مثلًا عناصر.
Speaker A
خليني أعمل كمان Enqueue. خليني أدخل العناصر عشان نشوف الأشياء المهمة اللي بتصير. بيدخل عندي الـ Index وبيزيد.
Speaker A
تمام؟ ففكرة إنه أنا بدي ألف ال ال ألف الأري أو أخليها تلف كلها بشكل دائري.
Speaker A
بيدخل عندي الـ Index وبيزيد المؤشر. خليني نسرع ونضيف العناصر. تمام. الآن أنا دخلت عناصر في الأراي.
Speaker A
فيها فانكشن وأنتم حرين بطريقة تعريفها. الكتاب بيتعامل معي بمؤشر واحد فقط وهو الفرونت. العرض البصري اللي شفناه على الموقع كان يتعامل معي بمؤشرين. اللي اللي هو الهيد والتيل بمعنى ال فلو ال فرونت والتيل.
Speaker A
هذه عملية الإدخال. لاحظتوا كيف. هلق أنا نشوف كيف عملية الـ Dequeue، عملية الحذف. لو أنا عملت Dequeue راح يروح للـ Head، لأول عنصر. تمام؟ هي عملت Dequeue. راح يروح لأول العنصر اللي كان موجود. يحذف القيمة ويزيد عنصر أو مؤشر الحذف. الموقع هنا أأكد عليكم إنه بيتعامل مع مؤشرين: مؤشر للإدخال ومؤشر للحذف. لكن الكتاب رح نشوف كيف الكود كاتبه بيتعامل بمؤشر واحد فقط.
Speaker A
عرفت أري تمام؟ اسمها داتا. وعرفت مؤشر أف اللي هو الفرونت بيبدأ من صفر والسايز اللي هو عدد العناصر في كمان بيبدأ من مين؟ ب- بيبدأ من صفر.
Speaker A
عملت كمان مرة Dequeue. بيروح لمكان الـ Index، بيحذف العنصر وبيغير معدل مؤشر الحذف. الآن لاحظنا هنا إنه ما صار عملية Shift.
Speaker A
عملية الإنكيو هي عملية إضافة. حتاخد الإليمنت. إذا كان السايز يساوي يساوي الداتا دوت لين- دوت لينث, يعني طول الأري, رح يرجعلي إكسبشن إنه فل.
Speaker A
زي ما بيصير في الآراي العادية، لأنه لو أنا بدي أعمل Shift في كل مرة رح أكلف... التكلفة في الوقت، في الوقت في التنفيذ، الـ Complexity رح تكون Big O of N، فهي تعتبر إنها بتاخد وقت كتير كبير لو كانت أنا عندي الآراي كبيرة، إني أنا أعمل إزاحة لكل العناصر في كل عنصر أنا رح أعمله حذف. فتم تطوير مفهوم الـ Circular Queue، الـ Circular Array.
Speaker A
ال- ال- أفيلابل إندكس, وين أنا ممكن أنا أضيف عناصر. هدول السطرين جدا مهمين, خلينا نفرق بينهم, لأنهم هم اللي بيوضحولي ال- المفهوم ال- المفهوم الكيو, يعني.
Speaker A
تمام؟ الـ Circular Array بمعنى إنه أنا بدي أعمل Wrap، أو أخلي العناصر كلهم ترجع مين؟ للصفر.
Speaker A
رح تاخد ال- ال- ال- سايز اللي هو ال- ال- الفرونت, وين موقعه, والسايز وبعدين تقسمهم على طول الأري. بعدين تقسمهم على طول الأري.
Speaker A
أخلي العناصر كلهم ترجع للصفر. لكن هنا عشان هيك، يعني كأنه أنا صار المؤشر تبعي بيبدأ من هذا... يعني هذا هو المؤشر، صار أنا عندي ما بطل يبدأ من الصفر.
Speaker A
ال- ال- ال- أف, الفرونت, تمام؟ ال- ال- يعني البوزيشن اللي أنا ال- ال- الفرونت اللي أنا عنده, والسايز الموجود, اللي هو حيعطوني في الآخر العنصر ال- التالي للعنصر اللي أنا واقفة عنده.
Speaker A
تمام؟ مؤشر الحذف أو المؤشر أول عنصر في الآراي اللي هو الـ Front صار يبدأ من عند اثنين، بطل يبدأ من صفر. فهي فكرة الـ Circular Array، كأنه الآراي صارت تلف، هي بنحلها بمعادلة رياضية رح نتعرف عليها.
Speaker A
بعدين يعمل إنسيرت للإليمنت أت ذيس إندكس, ويحد- ويحدث حجم السايز. الفرست بترجعلي ال- الأول عنصر, اللي هو الفرونت, الداتا أت ذا فرونت هذا هو العنصر هذا هو أول عنصر بعدين مين؟ أو نل إذا كانت إمتي أما الدي كيو
Speaker A
لو أنا بدي أعمل هلأ إضافة لعنصر، تمام؟ لو بدي أرجع أضيف العش
Speaker A
أنا بدي أحدث مين؟ بدي أحدث الأف بدي أغير قيمته لأنه ما بديش أعمل شيفت أنا ما بديش أعمل شيفت لو مطلوب أعمل شيفت كان عملنا شيفت لكل العناصر لكن بدي أحذف القيمة وأخلي مكان الفرونت نل أخلي مكان الفرونت نل
Speaker A
بعد هيك إيش بدي أعمل؟ بدي أحدث قيمة الفرونت وين راح يأشر؟ تمام؟ اللي هو هي هي الفورميلا لتحديث مكان الفرونت اللي هو الفرونت القديم بدي أضيفله عليه واحد وأعمله موديولو للينك تمام؟ هي الفورميلا بتحددلي النيو فرونت إندكس وين
Speaker A
الفرونت الجديد راح يكون؟ تمام؟ وين الفرونت الجديد راح يكون؟ لو ممكن نرجع إحنا نشوفها مرة ثانية هي أنا مثلاً صار أنا عندي الفرونت موجود هنا الفرونت موجود صار هنا مكان الحذف وين أنا ممكن أعمل إنسيرت جديد؟ بدنا نرجع هنا
Speaker A
للكود هلا أنا لو بدي أعمل إنكيو جديدة الأفيلبل راح يحسبها الفرونت أنا اللي موجود عندي الفرونت موجود عندي عند ثلاثة تمام؟ زائد السايز تبعي أكم من عنصر أنا موجود فيها؟ أكم من عنصر بنحسب إحنا موجود؟ 13 عنصر ونقسمهم على السايز تبعت الأري
Speaker A
اللي هو الـ 15 طلعلي إنه العنصر اللي بدي أضيف عنده هو التيل عندي الواحد تمام؟ فأنا لو ضفت عنصر جديد إن كيو رح يضيف عندي الواحد. كيف حسبها؟ بفكرة إنه الفرونت عندي الثلاثة اللي هو الهيد أو الفرونت عندي الثلاثة
Speaker A
تمام؟ زائد السايز قد كم من عنصر موجود فيها تقسيم الطول تبع الأري. لو بدي أعمل دي كيو رح يروح مين؟ الفر- للدي كيو كيف صارت؟ هنا.
Speaker A
هذا حاطه حذفلي أول عنصر موجود اللي هو عندي الأف وخلى قيمته نل. بدي يحدث مين؟ بده يحدث القيمة.
Speaker A
هي هي أنا عندي الفرونت هنا. بدي أعمل دي كيو رح يحذف هاي. بيخلي قيمتها نل. هلأ رح يصير لي الفرونت عند مين؟ عند الأربعة.
Speaker A
رح يصير الفرونت عند الأربعة. طبعًا الموديولو وهي عشان نتجنب نخليها سيركولر عشان نتجنب إنه أنا أسيب أماكن فارغة أسها عنها. لا، بدي أخليها سيركولر وتلف عن طريق الموديولو.
Speaker A
فهذول الكلام كثير مهم. اللي هو إني أنا أعرف الأفيلابل إندكس إني أنا أضيف فيه. تمام؟ أو خلينا نقدر نسميه التيل ممكن حسب الفيجيولايزيشن لكن خلينا نحن نعتمد تسمية الكتاب.
Speaker A
اللي هو الفرونت زائد السايز موديولو طول الأري. هو عبارة عن مين؟ عن التيل. الهيد هو الفرونت. المؤشر اللي أنا ببدأ أحذف منه. اللي ببدألي بداية الأري. تمام؟ تمام. الأخطاء اللي بال- المعلم بالأصفر هنا.
Speaker A
في خطأ شائع بيحكي إنه أنا ما بديش أضيف أضل أضيف عملية ال- ال- الإضافة على الأري لآخر عنصر ويطلعلي إكسبشن.
Speaker A
فأنا بستخدم الموديولو أريثميتك أوبريشن عشان أعمل أو عشان الكيو تعمل ورب إيه أراوند إيه ذا يوز فري سيل. بمعنى إنها تلف حوالين بعض تصير ال- الكيو بشكل دائري تلف حوالين بعض. فأنا أتعامل مع مين؟ أتعامل مع كل الخلايا الفارغة أو الفري اللي موجودة في
Speaker A
الأول. عملية الإنكيو، تمام؟ الإنكيو الإضافة بتستخدم الأفيليبل. اللي هو المتغير الـ عشان تحدد لي الإندكس وين أنا أضيفه، اللي هو الفرونت وين موجود زائد حجم العناصر الموجودين في الأري موديولو كله هذا تقسيم حجم الأري الكلي.
Speaker A
أما الديكيو، تمام؟ بتحدث قيمة إف بهي الطريقة. اللي هو إف بلس ون موديولو اللينث تبع الأري كلها بعد ما تخلي قيمة الـ الـ الـ العنصر نل. رح ترجع لي إياه وتعمل رياساين للداتا أت ذا فرونت.
Speaker A
وتخليها نل، تمام؟ وبهيك بتصير كل العمليات بتساوي واحد، اللي هو أوف ون. لأنه فقط أنا بتعامل هنا مع إنديسيز. لو أنا بدي أعمل في الديكيو شيفت رح تصير أنا عندي الأوبريـ الـ الـ الـ الـ الـ الـ الكومبلكسيتي لعملية الحذف أوف إن. فكان حلها إني أنا
Speaker A
أخلي الـ الـ الأري الـ الـ الأري كلها تكون سيركيولرلي معناها بشكل دائري تدور حوالين بعض.
Speaker A
تمام؟ تمام. خليني نشوف هنا طريقة بسيطة عشان نوضح كمان مرة مفهوم السيركيولر. إيه لينكيد ليست السيركيولر كيو.
Speaker A
كيف بتصير؟ تمام، لنفترض إنه إحنا أنا عندي هنا بدنا نتعامل بدنا نعمل التريسينغ عشان إحنا مش مش بشكل وجاهي فرح نتعامل مع الجداول ونشوف نحاول نوضحها لكم بأبسط طريقة.
Speaker A
الآن أنا في عندي نفترض سيركيولر كيو، تمام؟ بدي أعمل إنكيو. للعناصر كالتالي: خمسة. وثلاثة.
Speaker A
وسبعة. وتسعة، تمام؟ أنا عملت إنكيو للخمسة، إنكيو الثلاثة، إنكيو السبعة، إنكيو التسعة. فقلنا الـ الـ الـ الـ الكيو بتخلي لي الأري اللي بدخل نفسه هو اللي بطلع. فأنا صار في أنا عندي هنا أريي فيها خمسة وثلاثة وسبعة وتسعة. صحيح؟
Speaker A
وأنا في البداية نفترض إنه أنا حددت حجم الأريي الكلي أو لنفترض إنه كان أنا عندي الـ الـ داتا اللي هو الأريي، الأريي لينث الأريي لينث نفترض إنه كان عندي خمسة تمام؟ أنا دخلت فيها أربع عناصر فـ خلص رح يكون
Speaker A
هذا العنصر اللي وراها فارغ. فأنا هيك أنا بتكون أنا عندي الأريي موجودة. تمام؟ فالفرونت كان في البداية عند مين؟ عند الصفر.
Speaker A
عند الصفر هو أول عنصر دخلته. هلا ايش اللي بصير؟ خمسة حتدخل أول وحدة، حتاخد هي الفرونت، هو أول عنصر دخلته.
Speaker A
الفرونت هو أول عنصر بدخله. خلص، أحجزها عندها. دخلت الخمسة، بعدين دخلت وراها الثلاثة، دخلت وراها الأربعة، دخلت وراها إيه دخلت الثلاثة بعدين دخلت السبعة بعدين دخلت التسعة.
Speaker A
دخلتهم بشكل متتالي، تمام؟ يعني أنا اختصرت اللي صار فيها الـ دخلت العملية بدل ما أنا أضلني أحكيلكم خمسة بعدين الفرونت ضله صفر يتكرر لأنه خلص الفرونت هو ثابت عند أول عنصر. بعدين أنا بدأت أدخل العناصر، زودت الحجم لما وصل
Speaker A
عندي السايز سوري أربعة. فكان الـ الـ أفيلابل إندكس الموجودين اللي أنا أضيف عليهم في كل مرة، اللي هو الإندكس صفر وواحد واثنين وثلاثة.
Speaker A
تمام؟ لو أنا بدي أعمل هلا دي كيو، بدي أعملها مرتين. هذا اختصار كلام بينا يعني مش كلام برمجي.
Speaker A
بدي أعمل دي كيو مرتين، تمام؟ ايش رح ايش اللي رح يـ يحذفلي إياه؟ رح يحذف الخمسة تمام؟ ويخلي مكانها نل.
Speaker A
بعدين يحذف الثلاثة ويخلي مكانها نل. والسبعة. والتسعة يضلهم زي ما هم. وآخر عنصر بيكون إيش ماله؟ فارغ زي ما إحنا وضحنا.
Speaker A
تمام؟ طيب. تمام، هلا الفرونت وين بده يصير؟ حذفت أنا أول عنصر وخليته نل. بعدين عملت أبديت، صار هنا. بعدين أنا عملت دي كيو كمان مرة، حذفت الثلاثة وعملت أبديت للفرونت، صار عندي السبعة. إندكس السبعة زيرو واحد اثنين، يعني صار الفرونت أنا
Speaker A
عندي عند الاثنين. قديش عدد في عندي عدد عناصر؟ في عندي عنصرين. تمام؟ هلا. أفيلبل.
Speaker A
خلص، يعني في عندي أنا أفيلبل. مش مش مهم يعني هلا أنا وين بدي أحط. بيهمنيش هلا أنا في عملية الحذف الأفيلبل وين يكون.
Speaker A
طيب، بدي أرجع أعمل هلا إضافة. لاحظوا إنه أنا عندي. الإندكسز صفر وواحد. وأربعة فارغين.
Speaker A
بقدر أضيف فيهم. هلا أنا بدي أعمل إن كيو كمان مرة. بدي أعمل إن كيو للعنصر واحد.
Speaker A
الفرونت الموجود أنا عندي اثنين. تمام؟ هلا عملية الإضافة بتكون وين؟ يعني بعد. خلص، هلا هذا هو الفرونت من عنده أنا حأبدأ أحذف. أنا بدي أضيف للرير أبعد إشي.
Speaker A
تمام؟ كيف أنا كنت أجيب الرير؟ قلنا. وين بدي أعرف أنا العنصر الموجود عشان أجيب الرير أو الأفيلبل إندكس. اللي هو الفرونت الحالي عندي اثنين. زائد. قديش أنا عندي عدد عناصر كان موجود؟ اثنين.
Speaker A
تمام؟ قديش كان عندي عدد عناصر موجود؟ اثنين. اثنين زائد اثنين. موديولو. قديش السايز تبعي؟ أو اللينث سوري تبع الأري خمسة.
Speaker A
اعملوهم على الآلة الحاسبة بيطلع معي الإندكس رقم أربعة. معناها أنا حأضيف للإندكس رقم أربعة.
Speaker A
تصير الأري عندي. خليني أنا أنسخها. تصير الأري أنا عندي هنا واحد، تمام؟ لأنه أعطاني الأفيليبل إندكس أو الرير إندكس اللي أنا بدي أضيف عليه.
Speaker A
صار عندي مين؟ إيه، عند الإندكس أربعة، فأروح أنا عند الإندكس أربعة وحتصير عندي قيمة واحد، فقديش صار السايز؟ ثلاثة.
Speaker A
خليني أعمل إنكيو كمان مرة عشان نفهم الفكرة. إنكيو، بدي أضيف الـ الـ الـ الرقم اثنين.
Speaker A
الفرنت أنا عندي وين موجود؟ عند الاثنين، ما تغيرش، الفرنت تبعي صار أنا عند الاثنين.
Speaker A
والرير صار أنا عندي عند هنا. بس أنا بيهمنيش الرير، خلص أنا كل بدي أتعامل معاه بس في الفرنت والسايز، قديش عدد العناصر؟ تمام، كيف بدي أعرف وين أنا أضيف العناصر؟ نفتح قوس.
Speaker A
تمام؟ الـ الـ الـ الـ الفرنت أنا عندي عندي اثنين. وعدد العناصر الموجودين في الكيو ثلاثة.
Speaker A
زائد ثلاثة موديولو. الخمسة، قديش بيساوي؟ صفر. تمام؟ قديش باقي القسمة؟ صفر. فراح أروح عند الإندكس صفر وأضيف.
Speaker A
العنصر الجديد، اثنين. بدي أعمل إنكيو كمان مرة، إنكيو لثلاثة. الفرنت موجود أنا عندي عند الاثنين.
Speaker A
تمام؟ طبعًا هنا السايز صار فيه له أبديت، صار في عندي أربع عناصر. بعدين بدي أعرف وين الأفيليبل إندكس اللي أنا بدي أضيف فيه العنصر الـ الـ الجديد.
Speaker A
الفرنت لحد الآن موجود أنا عندي عند الاثنين. زائد. قديش عدد العناصر الموجودين؟ أربعة، موديولو الخمسة يساوي واحد، معنى هذا الكلام.
Speaker A
إنه أنا الأري صارت عندي. في هنا ثلاثة في هنا اثنين، تمام؟ نفس الأري اللي فوق ضفت أنا عندي الأندكس واحد العنصر فصار أنا في عندي خمس عناصر، صار أنا عندي خمس عناصر. الآن لو خلينا نعمل سيل جديدة في
Speaker A
الرو الجديد. بدي أعمل دي كيو تمام؟ حأعمل دي كيو. هلا الدي كيو حتحذف من مين؟ من عند الفرونت. هلا الفرونت أنا موجود عندي عند الأندكس اثنين، يعني رح تحذف السبعة تمام؟ بترجعلي هنا، بترجع ريتيرن سفن ورح يتحدث وبتخلي هلا السبعة قيمتها نل.
Speaker A
هلا الأري الجديدة اللي أنا بتعامل معها هي اثنين وعندي السبعة رح تخلي الداتا للأف هو داتا الاثنين رح تصير نل تمام؟ وال- وال- والفرونت رح يتحدث ويزيد، بيصير عندي أنا على الثلاثة، السايز تبعي بقل واحد بصير أربعة وهنا أساساً ما بحتاج الأفيبل
Speaker A
أندكس. فهذا الجدول كثير مهم إنكم تفهموا كيف بتصير العمليات على السيركولر كيو. مهم تفهموه لأنه ممكن يجيكم في أسئلة اختر وصح وخطأ، إيه برضه بخربط بخربط يعني لو- لو ما كنتوا متمكنين منه ف- وهي النوت والريممبر كثير مهمة إنه
Speaker A
الأفيبل أندكس أنتوا وين ممكن تضيفوا وتتعاملوا بهي ال- ال- ال- الإكسبيريشن وكيف أنا بحدث ال- ال- الفرونت من هاد ال- ال- الإكسبيريشن.
Speaker A
فمهم ال- ال- السيركولر كيو إيه مهم كثير تفهموه، تمام؟ ف- خلينا نحكي هنا ال- عن المقارنة ما بين ال- كيو وال- ستاك تمام؟ ال- ال- القاعدة تبعت ال- ستاك ليفو اللي هو لاست إن فيرست أوت، الكيو فيرست إن فيرست أوت. عملية الإدخال
Speaker A
ال- في ال- ستاك بتصير بال- بوش أتوب للأول، الكيو بتعمل إن كيو أت ذي باك لآخر إشي تمام اللي هو الريل. أنا دائمًا في الكيو بضيف للريل. تمام؟ أو للباك.
Speaker A
اللي عملية الحذف في الستات بعمل بوب من التوب. والدي كيو بتكون دائمًا من الفرونت. إيه لينكيد ليست مابينج. في لو أنا بدي أحول الستات ل أو أعملها لينكيد ليست بستعمل أد فيرست وريموف فيرست.
Speaker A
والكيو كمان لو أنا بدي أمثلها بال اللينكيد ليست بنفس الطريقة. ال ال كومبلكسيتي لهم كلهم بالآخر بتصير أوه أوف ون. تمام؟ ال إحنا في اللي تعرفنا على الكيو كأنها لينك يعني كأنها أري أو لو مثلتها بالأري لأنه هي دائمًا بتكون الأصعب شوية.
Speaker A
إيه لو بدي أنا أمثل ال الكيو بال باللينكيد ليست رح يكون الموضوع دائمًا مربوط بالأد فيرست تو أد أد لاست سوري وريموف فيرست.
Speaker A
حكينا عملية الستات لو بدي أمثلها بال باللينكيد ليست أد فيرست تو ريموف فيرست. لكن الكيو دائمًا بدي أضيف للآخر وأحذف من الأول. أضيف للآخر وأحذف من مين؟ من الأول. تمام؟ فهي هنا تمثيل ال الستات باللينكيد ليست بدي أنا أعرف ليست سينجل
Speaker A
لينكيد ليست أعملها بوش. أنا هنا عندي الستات هذه مراجعة سريعة للي صار. بوش معناها أنا حأضيف أد فيرست. بوش أد فيرست.
Speaker A
والحذف اللي هو ريموف مين؟ ريموف فيرست. ريموف لاست. تمام؟ ريموف لاست. ال الكيو بدي أنا أعرف برضو نفس الإشي ليست. عملية الإن كيو عملية الإضافة أنا بدي أضيف دائمًا للآخر.
Speaker A
تمام؟ وأحذف من مين؟ أحذف برضو من ال من الأول. بدي أحذف أول إشي دخلته يعني.
Speaker A
أول إشي بدخل هو آخر شيء بحذفه. فهي هي الفكرة. ال- ال- اللاب وورك وضحنا جزء كبير منه.
Speaker A
ال- وضحناهم هنا بال- بالمفاهيم يعني هي النظرية اللي وضحناهم بالجداول. خلينا نشوف مع بعض ال- في التطبيق عملي سريع على اللي صار.
Speaker A
تمام. الآن إيه أنا استدعيت المكتبات الأساسية للستات والكيو الموجودين في جافا اللي هو إحنا رح نتعامل معهم.
Speaker A
لأنه زي ما حكينا في المشاريع العملية إيه ما بنتعامل إنه نبني ال- ال- الكلاسات أو ال- جاهزة منها لا هي بتكون موجودة أساسًا بمكتبات جاهزة في جافا وإحنا بنستخدمها.
Speaker A
لكن كل الكلام اللي حكيناه عشان تفهموه ممكن ينطلب منكم إنكم تكتبوا منطق معين لجزء معين من هي ال- المفاهيم سواء ستاك أو كيو.
Speaker A
فاستدعيت الستات والكيو واستدعيت اللينكد ليست كمان. ال- عرفت ستاك. تمام؟ أنشأت ستاك جديدة. هلأ في المكتبات الأساسية في جافا تمام؟ ال- ال- اللي حكينا الستات هي بوش وبوب.
Speaker A
زي ما هم. زي ما تعرفنا عليهم في ال- في الكلاس. عملت بوش لواحد. بوش اثنين. بعدين بوش الثلاثة. عملت بوب حيطلع لي ثلاثة اثنين واحد.
Speaker A
تمام؟ لو بدي أعرف الكيو. تمام؟ ال- ال- ال- ما في شيء ما في شيء عندي ال- اللي هو ال- الإنكيو والدي كيو لا. في المكتبات الأساسية الإنكيو هي أوفر. تمام؟ والدي كيو.
Speaker A
الدي كيو كأنها إيش؟ كأنها عملية يعني هي عملية ال- ال- بول. ال- بول. الحذف.
Speaker A
تمام؟ هنا أنا عرفت الكيو كأنها لينكد ليست. لكن أنا ما فرجيتكم اللينكد ليست كيف بتصير بتطبيق عملي على الكيو.
Speaker A
خلينا نشوف الكيو ك- لينكد ليست عشان نوضح لكم المفاهيم بشكل كامل ونغطي اللاب كامل شاء الله. فأنا في البداية عندي أنا الهيد والتيل اللي هو زي ما حكينا الكتاب معرفهم كمتغير اللي الموقع معرفهم كمتغيرين لكن الكتاب لا، لكن نفهم احنا بشكل عام كيف
Speaker A
بيصير لو أنا بدي أعمل إنكيو للعشرة حأعمل نود جديدة حأحط فيها العشرة أخلي التيل وهي طبعًا بتأشر على النل والتيل يأشر عليها والهيد يأشر عليها.
Speaker A
حأرجع أعمل كمان إنكيو للعشرين ضفت متغير اللي هو نود جديدة بتأشر على نل وخليت التيل لاحظوا إنه أنا بضيف للآخر فدائمًا التيل رح يأشر عليهم. فالهيد هو بيأشر على أول عنصر دخلته هذا هو الفرونت هذا هو الفرونت.
Speaker A
فخلص أنا بعمل نود جديدة بضيفها وين الفرونت بلس يعني الـ على الـ المؤشر الثاني يعني بخلي الهيد هاي تأشر على النود الجديدة.
Speaker A
نضيف كمان مرة الـ 30 نود جديدة بتأشر على نل فيها الـ 30 بخلي النود اللي قبلها تأشر عليها وهي والتيل يأشر على النود الجديدة اللي عملناها.
Speaker A
لو بدي أعمل دي كيو هاي دي كيو حأحذف العشرة الهيد يأشر على الـ الـ فرونت النود اللي ورا الفرونت وبعدين ايش ماله؟ الـ الـ يحدثها فهي هو الفيجوالايزيشن اللي صار هذا هو الفيجوالايزيشن اللي صار اللي هو واضح لنا وضحناها احنا قلنا
Speaker A
الـ بدل ما نكرر الأكواد كثيرة فخلص أنا بستدعي ميثود أساسية بستدعي ميثود أساسية أنا أوريدي عرفتها كلينكد ليست.
Speaker A
تمام؟ فـ في الـ في الستاك عملية الإد فيرست بعمل إد فيرست تو ريموف فيرست للحذف.
Speaker A
في الـ الـ الـ العكس في مين؟ في الـ في الكيو العكس دائمًا بيكون مين؟ في الكيو بعمل إد لاست بـ بضيف للآخر ودائمًا بمين بحذف من الأول بضيف للآخر وبحذف من الأول.
Speaker A
الـ الـ نرجع نشوف الكود مرة ثانية، فهذا هو الكلام اللي عندي. خليني أنا أعمل كومنت مبدئياً على الكلام اللي هنا.
Speaker A
تمام، فهي النافذة الموجودة عندنا. الإيرور اللي ظهر في الأول كان بسبب خلل في الـ في الامتداد. كنت في الملف الـ العام من المشروع.
Speaker A
فدخلنا على الملف الموجود في الـ كود التنفيذ عشان ننفذ البرنامج. فـ هي حكينا الـ كيو أنا عرفناها كلينكد ليست. ضفنا أنا فيها عناصر، وفي الآخر مين؟ حذفناها.
Speaker A
تمام. فهي هي فكرة مين؟ فكرة الكيو اللي كانت واضحة معنا في الـ في اللينكد ليست. كيف نمثلها باستخدام استدعاء أساساً الست أو تعريفها كلينكد ليست واستخدام فانكشن أوريدي أنا عرفتها في الـ في الكلاس الخاص باللينكد ليست.
Speaker A
تمام، بعد هيك في عندي أنا كمان تطبيق في اللاب ورك هذا. بدنا نعرف فانكشن فانكشن إز بالانس. هي الفانكشن بدها تاخذ إكسبريشن اللي هو إحنا وضحناه. الإكسبريشن هذا بدي أنا أعرف هل هو متكافئ أو لا.
Speaker A
فبدي أعرف في البداية ستاك. قلنا الستاك هي أكثر شيء ممكن يفيدني. بدي أعرف ستاك.
Speaker A
إيه بدي أعمل لوب لكل كاركتر موجود. أول شيء أنا حولت هنا الإكسبريشن اللي أنا أخذته دوت شار أراي، يعني حيحول لي إياها لأراي.
Speaker A
كل كاركتر في أراي الـ الكاركتر اللي موجودين من الإكسبريشن. إذا كان الكاركتر هذا يساوي يساوي أحد الـ الـ التعبير الموجودة.
Speaker A
تمام؟ معناها بدي أضيفه للـ للستاك. بدي أعمل ستاك دوت بوش لهذا الـ الـ كاركتر.
Speaker A
إذا كان لا، معنى هذا الكلام، طبعاً هذه لاحظوا إنه هنا كأنه أنا بعملهم الأوبن إكسبريشن.
Speaker A
كأنه هنا تعبير الفتح. بدي أضيفه في الستاك. إذا كان لا، معناه هو من إيش؟ من الـ الإكسبريشن تاعون الغلق، بمعنى إنه هو الـ الـ الـ كلوز إيه.
Speaker A
يعني هو أقواس الـ اللي بتغلق الـ الـ الإكسبيريشن تبعي. إيش بدي أروح؟ إذا الستات تبعتي كانت فارغة، معناها إنه أنا ما دخلتش لحد الآن ولا إشي، معناها ما فيش عندي مكافئ له اللي هو تاعون الـ أوبن، فرح أرجع فولس
Speaker A
إنهم مش بالانس. غير هيك بدي أروح أعمل الـ بدي أروح أرجع من الستات، أعمل ستات دوت بوب وأخزنهم في التوب. إذا كان هذا التوب، تمام؟ يا أبدا.
Speaker A
أول شي بدي أحكي إذا كان الكاركتر مثلاً. يساوي يساوي أقواس الغلق. و يعني أند التوب لا يساوي قوس الفتح تبعي.
Speaker A
تمام؟ أو. الـ الـ إيه كان قوس غلق و والـ والتوب لا يساوي قوس الفتح المكافئ له، معناها هو ماله؟ مش بالانس.
Speaker A
غير هيك رح يرجعلي ترو. غير هيك رح يرجعلي ترو، فأنا لو أعطيته هنا إكسبيريشن.
Speaker A
زي ما هو موضح. إيه معنا أعطيته الإكسبيريشن الأول، لاحظوا إنه هي قوس الـ الـ الـ فتح وهنا مقابله قوس غلق، وهكذا يعني هذا رح يرجعلي ترو.
Speaker A
هنا قوس غلق مقابله قوس فتح، قوس الفتح تبعه. الـ الـ مكافئ له مش نفس الإشي، فرح فرح يرجعلي فولس، لو أنا نفذتهم.
Speaker A
مفترض إنه يطلعلي زي الأوت المتوقع. ترو أو فولس، تمام؟ رح يرجعلي ترو أو فولس هنا.
Speaker A
رح يرجعلي إنه الستات أنا معطياه إنه يرجع الستات إز إمتي. الستات دوت إز إمتي، هل هي لا أو لا؟ هل هي فارغة أو لا؟ تمام؟ فبـ هيك إحنا بنكون. خلصنا. الـ الـ لاب الـ الستات والكيوت عرفنا على أهم
Speaker A
المفاهيم، طبعاً أكيد الـ المكتبات الجاهزة بتختلف عن الـ الـ الموجود في الكتاب لأنه هذه إصدارات في الأخير من جافا، لكن البوش هي نفسها المكافئة بالمكتبة بوش البوب موجودة كمان في ال في مكتبة الستات بوب زي ما هي لكن في المكتبة مثلا بترمي اكسبشن ما
Speaker A
بترجعليش نل التوب في الستات في مكتبة الستات اسمها بيك بترجعلي برضه اكسبشن إذا كان يعني إذا كانت بدل ما تكون بدل ما يرجعنا لكن في الكتاب بترجع إنها اكسبشن الإنكيو في الكيو لايبراري بترجع أو اسمها أوفر الدي كيو بول
Speaker A
الفيرست هي نفسها البيك وبيرجعولي نل فبهيك بنكون خلصنا اللاب الرابع إن شاء الله
Topics:طابورQueueFIFOهياكل البياناتالمصفوفة الدائريةEnqueueDequeueلغة C++البرمجةاللاب الرابع











