Data Structures in AI - Part 2 PDF

Document Details

DedicatedSilver

Uploaded by DedicatedSilver

الحكم بن هشام بالمهد - مسارات

Tags

data structures ai algorithms programming

Summary

This document explains data structures used in artificial intelligence (AI). It describes different types of data structures, such as primitive and non-primitive data structures, and covers examples of linear and non-linear structures. It also provides practical code examples using Python. The document is intended for instructional purposes and demonstrates fundamental programming concepts related to AI applications.

Full Transcript

‫الدر س الثاين‬ ‫هياكل البيانات يف الذكاء اال صطناعي‬ ‫ أهمية هياكل البيانات يف الذكاء اال صطناعي‬ ‫‪The Importance of Data Structures in AI‬‬ ‫للبيان ات أهمي ة ك ربرى يف جم االت ال ذكاء اال صطناع ي ألأنه ا األأ سا س املُ س تخدَ م يف‬ ‫هياكل البيانات‬ ‫تدري ب من اذج تعلُّ م ا آآلل ة حي ث ُحُت ِّ دد...

‫الدر س الثاين‬ ‫هياكل البيانات يف الذكاء اال صطناعي‬ ‫ أهمية هياكل البيانات يف الذكاء اال صطناعي‬ ‫‪The Importance of Data Structures in AI‬‬ ‫للبيان ات أهمي ة ك ربرى يف جم االت ال ذكاء اال صطناع ي ألأنه ا األأ سا س املُ س تخدَ م يف‬ ‫هياكل البيانات‬ ‫تدري ب من اذج تعلُّ م ا آآلل ة حي ث ُحُت ِّ دد ج ودة البيان ات وكميّته ا املتواف رة دق ة وفعالي ة‬ ‫من اذج ال ذكاء اال صطناع ي‪.‬وب دون بيان ات كافي ة وذات صل ة‪ ،‬ل ن تتع ّل م خوارزمي ات‬ ‫(‪:)Data Structure‬‬ ‫الذكاء اال صطناعي األأمناط‪ ،‬ولن تقوم بالتنب ؤات‪ ،‬ولن تتمكن من أداء املهام بفاعلية‪.‬‬ ‫هي اكل البيان ات ه ي تقني ة‬ ‫وبالت ايل‪ ،‬تلع ب البيان ات دورًا رئي ًس ا يف ت ش كيل ق درات و إمكان ات ُ صن ع الق رار ل دى‬ ‫لتخزي ن وتنظي م البيان ات يف‬ ‫ أنظم ة ال ذكاء اال صطناع ي‪.‬هي اكل البيان ات له ا أهمي ة كب ريرة يف ال ذكاء اال صطناعي‬ ‫الذاكرة ال ستخدامها بكفاءة‪.‬‬ ‫ألأنه ا توف ر طريق ة ف َّعال ة لتنظي م وتخزي ن البيان ات‪ ،‬كم ا ت س مح با س رترجاع ومعاجل ة‬ ‫البيان ات بكف اءة‪.‬وكذل ك‪ُ ،‬حُت ِّ دد م دى تعقي د وكف اءة اخلوارزمي ات املُ س تخدَ مة يف معاجل ة البيان ات‪ ،‬وبالت ايل ت ؤ ث ر مبا ش ر ًة‬ ‫للتو س ع‬ ‫على أداء أنظمة الذكاء اال صطناعي‪.‬على س بيل املثال‪ ،‬ميكن حت س نين س رعة وقابلية خوارزميات الذكاء اال صطناعي ُّ‬ ‫با ستخدام هياكل البيانات املنا سبة‪ ،‬مما يجعلها أكرث مالءمة للتطبيقات يف العامل احلقيقي‪.‬وكذلك‪ ،‬ت ساعد هياكل البيانات‬ ‫املُ ص َّممة جيدً ا يف تقليل ا ستخدام الذاكرة وزيادة كفاءة اخلوارزميات‪ ،‬لتمكينها من معاجلة جمموعات أكرب من البيانات‪.‬‬ ‫تُخزِّ ن أجهزة احلا سب البيانات وتُعاجلها ب سرعة ودقة فائقتني‪.‬لذلك‪ ،‬من ال ضروري تخزين البيانات بكفاءة‪ ،‬وتوفري الو صول‬ ‫ إليها بطريقة سريعة‪.‬ميكن ت صنيف هياكل البيانات على النحو التايل‪:‬‬ ‫ هياكل البيانات األأوليّة‪.‬‬ ‫يُطلّق على البيانات الب سيطة كذلك‬ ‫البيانات األأوليّة‪ ،‬أو اخلام‪ ،‬أو األأ سا سية‪.‬‬ ‫ هياكل البيانات غري األأوليّة‪.‬‬ ‫يو ضح املُخطَّ ط يف ال شكل ‪ 1.11‬ت صنيف هياكل البيانات‪.‬‬ ‫هياكل البيانات‬ ‫(‪)Data Structures‬‬ ‫هياكل البيانات غري األأوليّة‬ ‫هياكل البيانات األأوليّة‬ ‫)‪(Non-Primitive Data Structures‬‬ ‫)‪(Primitive Data Structures‬‬ ‫ أعداد صحيحة‬ ‫)‪(Integer‬‬ ‫ أرقام ع شرية‬ ‫)‪(Float‬‬ ‫منطقية‬ ‫هياكل البيانات غري اخلطيَّة‬ ‫ن صية‬ ‫)‪(Non-Linear Data Structures‬‬ ‫)‪(Boolean) (Character‬‬ ‫هياكل البيانات اخلطيَّة )‪(Linear Data Structures‬‬ ‫القائمة املرتابطة‬ ‫)‪(Linked List‬‬ ‫الطابور‬ ‫)‪(Queue‬‬ ‫املُك ّد س‬ ‫)‪(Stack‬‬ ‫القامو س‬ ‫)‪(Dictionary‬‬ ‫ شكل ‪ُ :1.11‬خُمطَّ ط هياكل البيانات‬ ‫ال صف‬ ‫)‪(Tuple‬‬ ‫املخطط‬ ‫)‪(Graphs‬‬ ‫امل صفوفة‬ ‫)‪(Array‬‬ ‫ال شجرة‬ ‫)‪(Trees‬‬ ‫القائمة‬ ‫)‪(List‬‬ ‫‪23‬‬ ‫هياكل البيانات األأوليّة ‪Primitive Data Structures‬‬ ‫يُ ش ار إىل هي اكل البيان ات األأول ّي ة با س م هي اكل البيان ات األأ سا س ية يف لغ ة البايث ون‪ ،‬ويحت وي ه ذا‬ ‫ُرتجم بن وع البيانات‬ ‫الن وع م ن الهي اكل عل ى قي م ب س يطة للبيانات‪ُ.‬تخ ربر أنواع البيانات الب س يطة امل ِّ‬ ‫خزنها‪.‬هياكل البيانات األأولية يف لغة البايثون هي‪:‬‬ ‫التي ُي ِّ‬ ‫ األأرقام (‪ :)Numbers‬تُ ستخدَ م األأرقام لتمثيل البيانات الرقمية وهي‪:‬‬ ‫ األأعداد ال صحيحة‬‫ األأرقام الع شرية‬‫ ال سال سل الن صيّة (‪ :)Strings‬ال سال سل الن صيّة هي جمموعات من األأحرف والكلمات‪.‬‬ ‫ البيانات املنطقية (‪ :)Boolean‬تكون قيم البيانات املنطقية إما صحيحة أو خاطئة‪.‬‬ ‫تُ ستخدَم أنواع خمتلفة من‬ ‫هياكل البيانات لتطبيقات‬ ‫احلا سب ومهامّه املختلفة‬ ‫بنا ًء على ما يتطلبه‬ ‫امل شروع والقيود املفرو ضة‬ ‫على الذاكرة‪.‬‬ ‫هياكل البيانات غري األأوليّة ‪Non-Primitive Data Structures‬‬ ‫ُربمج وال‬ ‫هي اكل البيان ات غ رير األأول ّي ة ه ي هي اكل متخ ص ص ة ُتخ زِّ ن جمموع ة من القي م‪.‬يكتبه ا امل ِّ‬ ‫تُع َّرف بلغة البايثون مثل هياكل البيانات األأوليّة‪.‬‬ ‫ميكن تق سيم هياكل البيانات غري األأوليّة كذلك إىل نوعني‪:‬‬ ‫ هي اكل البيان ات اخلط ّي ة أو امل ُت سل س لة (‪:)Linear or sequential data structures‬‬ ‫معنّي‪.‬‬ ‫تُخزِّ ن هياكل البيانات اخلطيّة عنا صر البيانات يف ت سل سل ّ‬ ‫ هي اكل البيان ات غ رير اخلط َّي ة (‪ :)Non-linear data structures‬ال حتت وي هي اكل‬ ‫البيان ات غ رير اخلط َّي ة عل ى ارتباط ت سل س لي بني عنا ص ر البيانات‪ُ ،‬ومُيكن رب ط أي زوج أو‬ ‫جمموعة من عنا صر البيانات معًا‪ ،‬والو صول إليها دون ت سل سل ُحُم َّدد‪.‬‬ ‫هياكل البيانات اخلطيَّة ‪Linear Data Structures‬‬ ‫ُتخ زِّ ن هي اكل البيان ات اخلط َّي ة عنا ص ر البيان ات يف ت سل س ل مع ّنّين‪.‬يف هذا الدر س س تتعلّم‬ ‫بع ض هي اكل البيان ات اخلط ّي ة مث ل امل ُك ّد س (‪ )Stack‬والطاب ور (‪ ،)Queue‬وهم ا نوع ان‬ ‫من هياكل البيانات األأكرث ا ستخدامً ا يف احلياة اليومية‪.‬‬ ‫املُكدّ س ‪Stack‬‬ ‫ميك ن متثي ل املُك ّد س يف الواق ع مبجموع ة م ن الكت ب ُر َّ ص ت ف وق بع ضه ا البع ض‪ ،‬كم ا ه و‬ ‫مو ض ح يف ال ش كل ‪.1.12‬فإلإن ش اء تل ك املجموع ة‪ ،‬علي ك أن ت ض ع الكت ب بع ضها فوق بع ض‪،‬‬ ‫ّ‬ ‫وعندم ا تري د ا س تخدام أ ح د الكت ب‪ ،‬علي ك أخ ذ الكت اب من أعل ى املجموع ة‪.‬وللو صول إىل‬ ‫الكتب األأخرى عليك إنزال الكتب من أعلى املجموعة‪.‬‬ ‫متغرّيًا ديناميكيًا‪.‬‬ ‫قد يكون حجم امل ُكدّ س ثابتًا أو ّ‬ ‫تُطبِّق لغة البايثون امل ُكدّ سات با ستخدام القوائم‪.‬‬ ‫‪24‬‬ ‫ شكل ‪ :1.12‬كومة من الكتب كمثال‬ ‫واقعي على املُكدّ س‬ ‫قاعدة املُ ضاف آخرً ا‬ ‫أواًل‬ ‫َخرج ً‬ ‫ي ُ‬ ‫(‪:)Last In First Out-LIFO‬‬ ‫ آخر عن صر ُم ضاف ميكن‬ ‫الو صول إليه ًأواًل‪.‬‬ ‫العمليات يف املُكدّ س ‪Operations on the stack‬‬ ‫هناك عمليتان رئي ستان يف املُكدّ س‪:‬‬ ‫ إ ضافة عن صر (‪ :)Push‬تُ ستخدَ م العملية إلإ ضافة عن صر يف قمة املُكدّ س‪.‬‬ ‫ حذف عن صر (‪ :)Pop‬تُ ستخدَ م العملية حلذف عن صر من قمة املُكدّ س‪.‬‬ ‫عملية إ ضافة عن صر ‪Push operation‬‬ ‫يُط َل ق عل ى عملي ة إ ضاف ة عن ص ر جدي د إىل املُك ّد س ا س م إ ضاف ة عن ص ر‬ ‫(‪.)Push‬‬ ‫يَ س تخدِ م املُك ّد س م ؤ شّ رًا ُيطل ق علي ه م ؤ ش ر األأعل ى (‪ ،)Top‬ويُ ش رير إىل‬ ‫العن صر املوجود يف قمة املُكدّ س‪ ،‬وعند إ ضافة عن صر جديد إىل املُكدّ س‪:‬‬ ‫ ت زداد قيم ة م ؤ ش ر األأعل ى بقيم ة واح دة إلإظه ار املوق ع اجلدي د ال ذي‬ ‫ س ُي ضاف العن صر فيه‪.‬‬ ‫ يُ ضاف العن صر اجلديد إىل قمة املُكدّ س‪.‬‬ ‫َفيْ ض امل ُكدّ س ‪Stack Overflow‬‬ ‫يتميز املُكدّ س ب سعة تخزينية ُحُمدَّدة تعتمد على ذاكرة احلا سب‪.‬إذا‬ ‫كانت الذاكرة ممتلئة‪ ،‬ف إن إ ضافة عن صر جديد سينتج عنها م شكلة‬ ‫َفيْ ض امل ُكدّ س (‪.)Stack Overflow‬ويق صد بها جتاوز ال سعة؛ لذا‬ ‫يجب التحقق من امتالء ذاكرة املُكدّ س قبل إ ضافة أي عن صر جديد‪.‬‬ ‫العن صر‬ ‫عند القمة‬ ‫َغيْ ض امل ُكدّ س ‪Stack Underflow‬‬ ‫ إذا كن ت ترغ ب يف ح ذف عن ص ر من املُك ّد س‪ ،‬عليك التّحقّ ق ًأواًل من‬ ‫ أن املُك ّد س يحت وي عل ى عن ص ر واح د عل ى األأق ل؛ ف إذا كان املُك ّد س‬ ‫فارغًا‪ ،‬سوف ينتج عن ذلك م شكلة َغيْ ض امل ُكدّ س (‪)StackUnderflow‬‬ ‫ويق صد بها االنخفا ض عن احلد األأدنى لل سعة‪.‬‬ ‫العن صر‬ ‫عند القمة‬ ‫‪E‬‬ ‫‪E‬‬ ‫‪D‬‬ ‫‪D‬‬ ‫‪D‬‬ ‫‪C‬‬ ‫‪C‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪B‬‬ ‫‪B‬‬ ‫‪A‬‬ ‫‪A‬‬ ‫‪A‬‬ ‫املُكدّ س النهائي‬ ‫املُكدّ س األأ ّويل‬ ‫ شكل ‪ :1.13‬عملية إ ضافة عن صر إىل املُكدّ س‬ ‫حذف عن صر‬ ‫من امل ُكدّ س‬ ‫عملية حذف عن صر ‪Pop operation‬‬ ‫يُطلق على عملية حذف عن صر من املُكدّ س ا سم حذف عن صر (‪.)Pop‬‬ ‫عند حذف عن صر من املُكدّ س‪:‬‬ ‫ يُحذَ ف العن صر من قمة املُكدّ س‪.‬‬ ‫ تنخف ض قيمة م ؤ ش ر األأعلى بقيمة واحد إلإظهار العن صر التايل عند قمة‬ ‫املُكدّ س‪.‬‬ ‫ إ ضافة عن صر‬ ‫ إىل امل ُكدّ س‬ ‫العن صر‬ ‫عند القمة‬ ‫العن صر‬ ‫عند القمة‬ ‫‪E‬‬ ‫‪E‬‬ ‫‪D‬‬ ‫‪D‬‬ ‫‪D‬‬ ‫‪C‬‬ ‫‪C‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪B‬‬ ‫‪B‬‬ ‫‪A‬‬ ‫‪A‬‬ ‫‪A‬‬ ‫املُكدّ س النهائي‬ ‫املُكدّ س ا أأل ّويل‬ ‫ شكل ‪ :1.14‬عملية حذف عن صر من املُكدّ س‬ ‫‪25‬‬ ‫املُكدّ س يف لغة البايثون ‪Stack in Python‬‬ ‫ُمُتثَّل املُكدّ سات يف لغة البايثون با ستخدام القوائم التي بدورها تُقدِّ م بع ض العمليات التي ُمُيكن تطبيقها مبا شر ًة على املُكدّ سات‪.‬‬ ‫كد س‬ ‫جدول ‪ :1.2‬عمليات املُ ّ‬ ‫العملية‬ ‫)‪listName.append(x‬‬ ‫)(‪listName.pop‬‬ ‫الو صف‬ ‫ إ ضافة العن صر ‪ x‬إىل نهاية القائمة‪.‬‬ ‫حذف العن صر األأخري من القائمة‪.‬‬ ‫تُطبَّق عملية إ ضافة عن صر‬ ‫للمُكدّ س يف لغة البايثون‬ ‫با ستخدام دالة ‪.append‬‬ ‫مثااًل على تطبيق املُكدّ س يف لغة البايثون‪:‬‬ ‫ ست شاهد ً‬ ‫‪  1‬أن شئ املُكدّ س لتخزين جمموعة من األأرقام (‪.)45 ،32 ،21 ،1‬‬ ‫‪2‬‬ ‫ِ‬ ‫ا ستخدم عملية حذف عن صر (‪ )Pop‬من املُكدّ س مرتني حلذف العن صرين األأخريين (‪ )45 ،32‬من املُكدّ س‪.‬‬ ‫ِ‬ ‫‪3‬‬ ‫ا ستخدم عملية إ ضافة عن صر (‪ )Push‬إىل املُكدّ س إلإ ضافة عن صر جديد (‪ )78‬إىل املُكدّ س‪.‬‬ ‫ إ ضافة عن صر‬ ‫ إىل امل ُكدّ س‬ ‫العن صر عند‬ ‫القمة‬ ‫‪45‬‬ ‫‪45‬‬ ‫ إ ضافة عن صر‬ ‫ إىل امل ُكدّ س‬ ‫ إ ضافة عن صر‬ ‫ إىل امل ُكدّ س‬ ‫‪32‬‬ ‫‪32‬‬ ‫‪32‬‬ ‫‪21‬‬ ‫‪21‬‬ ‫‪21‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫ إ ضافة عن صر‬ ‫ إىل امل ُكدّ س‬ ‫‪21‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪45‬‬ ‫ إ ضافة عن صر‬ ‫ إىل امل ُكدّ س‬ ‫‪32‬‬ ‫حذف عن صر‬ ‫من امل ُكدّ س‬ ‫‪78‬‬ ‫‪45‬‬ ‫‪32‬‬ ‫‪32‬‬ ‫‪21‬‬ ‫‪21‬‬ ‫‪21‬‬ ‫‪21‬‬ ‫‪21‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪78‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪26‬‬ ‫حذف عن صر‬ ‫من امل ُكدّ س‬ ‫ شكل ‪ :1.15‬مثال على املُكدّ س‬ ‫مفكرة جوبيرت ‪Jupyter Notebook‬‬ ‫يف ه ذه الوح دة س تكتب مقط ًع ا برجم ًّي ا بلغ ة البايث ون با س تخدام مفك رة جوبي رتر‬ ‫ تخدم إلإن ش اء املُ س تندات احلا س وبية‬ ‫(‪.)Jupyter Notebook‬وه ي تطبي ق الوي ب املُ س َ‬ ‫وم ش اركتها‪.‬كل ُم س تند ُي س مى مفك رة‪ ،‬ويحت وي عل ى املقط ع الربجم ي ال ذي كتب َت ه‪،‬‬ ‫والتعليق ات‪ ،‬والبيان ات األأول ّي ة واملُعاجل ة‪ ،‬وت ص وّرات البيان ات‪.‬ستَ س تخدِ م اإلإ ص دار غ رير‬ ‫امل ُت ص ل باإلإنرتن ت (‪ )Offline‬م ن مفك رة جوبي رتر‪ ،‬و أ س هل طريقة لتثبيت ه حمليًا هي من‬ ‫خ الال أناكون دا (‪ )Anaconda‬وه ي من ص ة توزي ع مفتوح ة امل ص در للطلب ة واله واة‪،‬‬ ‫وميكنك تنزيلها وتثبيتها من الرابط التايل‪:‬‬ ‫َ‬ ‫‪https://www.anaconda.com/products/distribution‬‬ ‫‪2‬‬ ‫و سيتم تثبيت لغة البايثون ومفكرة جوبيرت تلقائيًا‪.‬‬ ‫لفتح مفكرة جوبيرت (‪:)Jupyter Notebook‬‬ ‫‪3‬‬ ‫>ا ضغط على ‪( Start‬بدء)‪ 1 ,‬ثم ا ضغط على ‪ ( Anaconda3‬أناكوندا ‪.)3‬‬ ‫>اخرت ‪( Jupyter Notebook‬مفكرة جوبيرت)‪3.‬‬ ‫> ستظهر ال صفحة الرئي سة ملفكرة جوبيرت يف املت صفح‪.‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫ال صفحة الرئي سة‬ ‫لمفكرة جوبيتر‪.‬‬ ‫ شكل ‪ :1.16‬ال صفحة الرئي سة ملفكرة جوبيرت‬ ‫‪27‬‬ ‫إلإن شاء مفكرة جوبيرت جديدة‪:‬‬ ‫>يف الزاوية اليمنى العلوية من شا شتك‪ ،‬ا ضغط على ‪( New‬جديد)‪.‬‬ ‫>حدِّ د )‪( Python 3 (ipykernel‬بايثون ‪2.)3‬‬ ‫> سيتم فتح املفكرة اخلا صة بك يف عالمة تبويب جديدة يف املت صفح اخلا ص بك‪.‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪3‬‬ ‫يمكنك تحميل مفكرتك من‬ ‫جهاز الحا سب الخا ص بك‪.‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫اال سم االفترا ضي‬ ‫للمفكرة هو "بدون عنوان"‪.‬‬ ‫‪28‬‬ ‫ شريط أدوات‬ ‫المفكرة‪.‬‬ ‫ شكل ‪ :1.17‬إن شاء مفكرة جوبيرت جديدة‬ ‫خلية المقطع البرمجي‪.‬يمكنك كتابة ن ص‪ ،‬أو‬ ‫معادلة ريا ضية أو أمر بلغة البايثون‪.‬‬ ‫اآلآن وبع د أن أ صبح ت مُفكرت ك جاه زة‪ ،‬ح ان الوق ت لكتاب ة‬ ‫برناجمك األأول وت شغيله فيها‪.‬‬ ‫إلإن شاء برنامج يف مفكرة جوبيرت‪:‬‬ ‫> أكتب األأوامر داخل خلية املقطع الربجمي‪.‬‬ ‫>ا ضغط على ‪( Run‬ت شغيل)‪2.‬‬ ‫> سيتم عر ض النتيجة حتت األأوامر‪3.‬‬ ‫ميكنك احل صول على العديد من اخلاليا املختلفة التي‬ ‫حتتاجها يف نف س املفكرة حيث حتتوي كل خلية على مقطعها‬ ‫الربجمي اخلا ص‪.‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫عند ت شغيل برنامجك‬ ‫ ستتم إ ضافة خلية‬ ‫مقطع برمجي جديدة‬ ‫تلقائيًا‪.‬‬ ‫‪3‬‬ ‫ شكل ‪ :1.18‬إن شاء برنامج يف مفكرة جوبيرت‬ ‫حان الوقت حلفظ مفكّرتك‪.‬‬ ‫ُمُيكنك ت شغيل برناجمك بال ضغط على‬ ‫‪Shift‬‬ ‫‪+‬‬ ‫‪Enter ‬‬ ‫‪.‬‬ ‫حلفظ املفكرة اخلا صة بك‪:‬‬ ‫‪1‬‬ ‫>ا ضغط على ‪( File‬ملف)‬ ‫>اخرت ‪( Save as‬حفظ كــ)‪2.‬‬ ‫>اكتب ا سمًا ملفكرتك‪3.‬‬ ‫>ا ضغط على ‪( Save‬حفظ)‪4.‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫لقد تغ ّير ا سم‬ ‫المفكرة‪.‬‬ ‫يتم حفظ املفكرة‬ ‫تلقائيًا أثناء عملك‪.‬‬ ‫ شكل ‪ :1.19‬حفظ املفكرة اخلا صة بك‬ ‫‪4‬‬ ‫‪3‬‬ ‫‪29‬‬ :‫ يف مفكرة جوبيرت‬1.15 ‫لت شاهد املثال يف ال شكل‬.)45 ،32 ،21 ،1( ‫ أن شئ املُكدّ س لتخزين جمموعة من األأرقام‬.1 ِ.‫) من املُكدّ س مرتني حلذف العن صرين األأخريين منه‬Pop( ‫ا ستخدم عملية حذف عن صر‬.2 ِ.‫) إىل املُكدّ س إلإ ضافة عن صر جديد إليه‬Push( ‫ا ستخدم عملية إ ضافة عن صر‬.3 myStack=[1,21,32,45] print("Initial stack: ", myStack) print(myStack.pop()) print(myStack.pop()) print("The new stack after pop: ", myStack) myStack.append(78) print("The new stack after push: ", myStack) ‫ لعر ض‬print(myStack.pop()) ‫تُ ستخدَ م الدالة‬.myStack.Pop() ‫ُ سترجعة من دالة‬ َ ‫القيم الم‬ Initial stack: [1, 21, 32, 45] 45 32 The new stack after pop: [1, 21] The new stack after push: [1, 21, 78] myStack=[1,21,32,45] print("Initial stack:", myStack) a=len(myStack) print("size of stack",a).‫ لعر ض طول المُكدّ س‬len ‫تُ ستخدَ م الدالة‬ # empty the stack for i in range(a): myStack.pop() print(myStack) myStack.pop() ‫يُ ستخدَ م هذا األأمر لحذف‬.‫كل العنا صر من المُكدّ س‬ Initial stack: [1, 21, 32, 45] size of stack 4 [] -------------------------------------------------------------------IndexError Traceback (most recent call last) Input In , in () 7 myStack.pop() ‫يظهر الخط أ ألأن المُكدّ س‬ 8 print(myStack) ‫فارغ و أنت كتبت أمر حذف‬ ----> 9 myStack.pop().‫عن صر منه‬ IndexError: pop from empty list IndexError ‫خط أ الفهر س‬ ‫ س تالحظ ظه ور خط أ عندم ا كتب تَ أ م ر ح ذف عن ص ر م ن املُك ّد س الف ارغ وت س بب ه ذا يف َغ ْي ض امل ُك ّد س‬.‫ عليك دومً ا التحقق من وجود عنا صر يف املُكدّ س قبل حماولة حذف عن صر منه‬.)Stack Underflow( 30 ‫ س يظهر بالربنام ج قائم ة تطل ب من ك‬،‫ أو حتذفه ا من ه‬،‫يف الربنام ج الت ايل ستن ش ئ مُكدّ ًس ا جدي دً ا وت ضي ف العنا ص ر إلي ه‬.‫حتديد اإلإجراء الذي تود القيام به يف كل مرة‬.‫ من قائمة الربنامج‬1 ‫ ا ضغط على الرقم‬،‫ إلإ ضافة عن صر إىل املُكدّ س‬.‫ من قائمة الربنامج‬2 ‫ ا ضغط على الرقم‬،‫ حلذف عن صر من املُكدّ س‬.‫ من قائمة الربنامج‬3 ‫ ا ضغط على الرقم‬،‫ للخروج من الربنامج‬ def push(stack,element): stack.append(element) def pop(stack): return stack.pop() def isEmpty(stack): return len(stack)==0 def createStack(): return [] newStack=createStack() while True: print("The stack so far is:",newStack) print("-----------------------------") print("Choose 1 for push") print("Choose 2 for pop") print("Choose 3 for end") print("-----------------------------") choice=int(input("Enter your choice: ")) while choice!=1 and choice!=2 and choice!=3: print ("Error") choice=int(input("Enter your choice: ")) if choice==1: x=int(input("Enter element for push: ")) push(newStack,x) elif choice==2: if not isEmpty(newStack): print("The pop element is:",pop(newStack)) else: print("The stack is empty") else: print("End of program") break; 31 The stack so far is: [] ----------------------------Choose 1 for push Choose 2 for pop Choose 3 for end ----------------------------Enter your choice: 1 Enter element for push: 26 The stack so far is: ----------------------------Choose 1 for push Choose 2 for pop Choose 3 for end ----------------------------Enter your choice: 1 Enter element for push: 18 The stack so far is: [26, 18] ----------------------------Choose 1 for push Choose 2 for pop Choose 3 for end ----------------------------Enter your choice: 1 Enter element for push: 23 The stack so far is: [26, 18, 23] ----------------------------- :‫َنفِّذ الربنامج ال سابق كما يلي‬.‫ أن شئ مُكدّ سً ا من ثالثة أرقام‬.‫ أ ضف العنا صر إىل املُكدّ س‬ ‫ أ ضف العن صر‬ ‫ إىل امل ُكدّ س‬ ‫ أ ضف العن صر‬ ‫ إىل امل ُكدّ س‬ 23 ‫ أ ضف العن صر‬ ‫ إىل امل ُكدّ س‬ 18 18 26 26 26 ‫ إ ضافة العنا صر‬:1.20 ‫ شكل‬ Choose 1 for push Choose 2 for pop Choose 3 for end ----------------------------Enter your choice: 2 The pop element is: 23 The stack so far is: [26, 18] ----------------------------Choose 1 for push Choose 2 for pop Choose 3 for end ----------------------------Enter your choice: 2 The pop element is: 18 The stack so far is: ----------------------------Choose 1 for push Choose 2 for pop Choose 3 for end ----------------------------Enter your choice: 3 End of program ‫ ثم‬،‫ميكن ك اآلآن ح ذف عن صري ن م ن املُك ّد س‬.‫اخلروج من الربنامج‬ ‫حذف العن صر‬ ‫من امل ُكدّ س‬ 23 ‫حذف العن صر‬ ‫من امل ُكدّ س‬ 23 18 18 18 26 26 26 ‫ حذف العنا صر‬:1.21 ‫ شكل‬ 32 ‫الطابور ‪Queue‬‬ ‫هي كل البيان ات الت ايل ال ذي ست س تعر ضه ه و الطاب ور‪.‬تُ ص ا ِدف ع اد ًة طواب رير يف‬ ‫حيات ك اليومي ة‪.‬الطاب ور األأك رثر ش يوعً ا ه و طاب ور انتظ ار ال س يارات عن د إ ش ارة‬ ‫املرور‪.‬عندما تتحول إ ش ارة املرور إىل اللون األأخ ضر‪ ،‬س تكون ال س يارة التي دخلت‬ ‫ إىل الطاب ور ًأواًل ه ي نف س ها الت ي تخ رج من ه ًأواًل‪.‬الطابور هو هي كل البيانات الذي‬ ‫أواًل (‪ ، )First In First Out - FIFO‬مم ا يعن ي‬ ‫أواًل َيخ رُج ً‬ ‫َيتب ع قاع دة امل ُ ض اف ً‬ ‫ أن كل عن صر يف الطابور ُيق َّدم بالرتتيب نف سه الذي و صل به إىل الطابور‪.‬‬ ‫قاعدة المُ ضاف ًأواًل يَخرُج ًأواًل‬ ‫أواًل‬ ‫أواًل يَخرُ ج ً‬ ‫قاعدة املُ ضاف ً‬ ‫(‪:)First In First Out (FIFO) rule‬‬ ‫العن ص ر األأول املُ ض اف إىل القائمة ُيعالَج‬ ‫ ًأواًل‪ ،‬والعن صر األأحدث ُيعالَج آخرًا‪.‬‬ ‫الفرق بني امل ُكدّ س والطابور هو أنه يف امل ُكدّ س‬ ‫تتم إ ضافة وحذف العن صر من نف س اجلانب‪،‬‬ ‫ويف الطابور تتم اإلإ ضافة من جانب‪ ،‬بينما‬ ‫يتم احلذف من اجلانب اآلآخر‪.‬وهكذا‪ ،‬عند‬ ‫احلذف يف امل ُكدّ س‪ ،‬يُحذف العن صر امل ُ ضاف‬ ‫ آخرًا‪ ،‬بينما يف الطابور‪ ،‬يُحذف العن صر‬ ‫أواًل‪.‬‬ ‫امل ُ ضاف ً‬ ‫العمليات يف الطابور ‪:Operations on the Queue‬‬ ‫هناك عمليتان رئي ستان يف الطابور‪:‬‬ ‫ إ ضافة عن صر للطابور (‪ :)Enqueue‬تُ ستخدَ م العملية إلإ ضافة عن صر يف آخر الطابور‪.‬‬ ‫ ح ذف عن ص ر م ن الطاب ور (‪ :)Dequeue‬تُ س تخدَ م العملي ة حل ذف عن ص ر من مقدمة‬ ‫الطابور‪.‬‬ ‫م ؤ شرات الطابور ‪Queue Pointers‬‬ ‫الفهر س (‪:)Index‬‬ ‫الفهر س ه و رق م ُيح ِّ دد مو ض ع‬ ‫العن صر يف هيكل البيانات‪.‬‬ ‫يحتوي الطابور على م ؤ شرين‪:‬‬ ‫ امل ؤ شر األأمامي (‪ :)Front Pointer‬يُ شري إىل العن صر األأول يف الطابور‪.‬‬ ‫ امل ؤ شر األأخري (‪ُ :)Rear Pointer‬ي شري إىل العن صر األأخري يف الطابور‪.‬‬ ‫ إ ضافة عن صر‬ ‫للطابور‬ ‫امل ؤ شر اخللفي‬ ‫امل ؤ شر (‪:)Pointer‬‬ ‫امل ؤ ش ر ه و ُمتغري يُخزِّ ن أو يُ ش رير‬ ‫ إىل عن وان ُمتغ رير آخ ر‪.‬امل ؤ ش ر‬ ‫ي ش به رق م ال صفح ة يف فهر س‬ ‫الكت اب الذي ُي س ِّهل عل ى القارئ‬ ‫الو صول إىل املحتوى املطلوب‪.‬‬ ‫امل ؤ شر األأمامي‬ ‫‪Q u e u e‬‬ ‫‪31‬‬ ‫‪14‬‬ ‫‪4‬‬ ‫‪23‬‬ ‫‪56‬‬ ‫‪12‬‬ ‫‪7‬‬ ‫‪21‬‬ ‫‪43‬‬ ‫‪17‬‬ ‫‪9‬‬ ‫‪10‬‬ ‫‪9‬‬ ‫‪8‬‬ ‫‪7‬‬ ‫‪6‬‬ ‫‪5‬‬ ‫‪4‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫ شكل ‪ :1.22‬العمليات يف الطابور‬ ‫حذف عن صر‬ ‫من الطابور‬ ‫الفهر س‬ ‫‪33‬‬ ‫عملية إ ضافة عن صر للطابور ‪Enqueue Operation‬‬ ‫يُطل ق عل ى عملي ة إ ضاف ة عن ص ر جدي د إىل الطاب ور ا س م إ ضاف ة عن ص ر للطاب ور‬ ‫(‪.)Enqueue‬إلإ ضافة عن صر جديد إىل الطابور‪:‬‬ ‫ تت م زي ادة قيم ة امل ؤ ش ر اخللف ي بقيم ة واح د بحي ث ي ش رير إىل مو ض ع العن ص ر اجلدي د‬ ‫الذي سيُ ضاف‪.‬‬ ‫ تتمّ إ ضافة العن صر‪.‬‬ ‫األأمامي‬ ‫اخللفي‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪A‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫اخللفي‬ ‫‪D‬‬ ‫قبل‬ ‫ال ميكنك إ ضافة عن صر أو‬ ‫حذفه من و سط الطابور‪.‬‬ ‫األأمامي‬ ‫اخللفي‬ ‫األأمامي‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪A‬‬ ‫‪D‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪A‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫بعد‬ ‫ إ ضافة عن صر للطابور‬ ‫ شكل ‪ :1.23‬عملية إ ضافة عن صر للطابور‬ ‫عملية حذف عن صر من الطابور ‪Dequeue Operation‬‬ ‫يُطلق على عملية حذف عن صر من الطابور ا سم حذف عن صر من الطابور (‪.)Dequeue‬‬ ‫حلذف عن صر من الطابور‪:‬‬ ‫ يُحذف العن صر املُ شار إليه بامل ؤ شر األأمامي‪.‬‬ ‫ تتم زيادة قيمة امل ؤ ش ر األأمامي بقيمة واحد بحيث ي ش رير إىل العن صر اجلديد التايل يف‬ ‫الطابور‪.‬‬ ‫اخللفي‬ ‫األأمامي‬ ‫اخللفي‬ ‫األأمامي‬ ‫اخللفي‬ ‫األأمامي‬ ‫‪D‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪A‬‬ ‫‪D‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪A‬‬ ‫‪D‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫قبل‬ ‫حذف عن صر من الطابور‬ ‫ شكل ‪ :1.24‬عملية حذف عن صر من الطابور‬ ‫‪34‬‬ ‫قبل أي إجراء عليك‬ ‫التحقق مما إذا كانت هناك‬ ‫م ساحة فارغة يف الطابور‬ ‫إلإ ضافة عن صر جديد‪،‬‬ ‫وتوافر عن صر واحد على‬ ‫األأقل لت صديره‪.‬‬ ‫بعد‬ ‫الطابور يف لغة البايثون ‪Queue in Python‬‬ ‫ميك ن متثي ل الطاب ور بع دة ط رق متنوع ة يف لغ ة البايث ون منه ا القوائ م (‪.)Lists‬ويرج ع ذل ك إىل حقيق ة أن القائم ة متث ل‬ ‫جمموعة من العنا صر اخلطيّة‪ ،‬كما ميكن إ ضافة عن صر يف نهاية القائمة وحذف عن صر من بداية القائمة‪.‬‬ ‫ ستتعلم فيما يلي ال صيغ العامة لبع ض العمليات التي ميكن تنفيذها على الطابور‪:‬‬ ‫جدول ‪ُ :1.3‬ط ُرق الطابور‬ ‫الو صف‬ ‫الطريقة‬ ‫)‪ listName.append(x‬ت ضيف العن صر ‪ x‬إىل القائمة التي متثل الطابور‪.‬‬ ‫حتذف العن صر األأول من القائمة‪.‬‬ ‫)‪listName.pop(0‬‬ ‫تُ س تخدَ م طريق ة )(‪ listName.pop‬ل ٍ‬ ‫ كل م ن هي اكل بيان ات املُك ّد س والطاب ور‪.‬عندم ا تُ س تخدَ م م ع املُك ّد س‪ ،‬ال‬ ‫تتطل ب الطريق ة أي مُعام ل‪.‬بينم ا تتطل ب الطريق ة إ ضاف ة صف ر إىل املُعام ل عندم ا تُ س تخدم م ع الطاب ور‪:‬‬ ‫ُو ضح يف اجلدول ‪ 1.4‬أدناه‪.‬‬ ‫(‪.listName.pop(0‬الفرق بني الدالتني م ّ‬ ‫جدول‬ ‫‪ :1.4‬طريقة )(‪ listName.pop‬مقابل طريقة )‪listName.pop(0‬‬ ‫الطريقة‬ ‫)(‪listName.pop‬‬ ‫)‪listName.pop(0‬‬ ‫الو صف‬ ‫ إذا كان ُم ِ‬ ‫عامل الدالة فارغً ا‪ُ ،‬يحذف العن صر األأخري من نهاية القائمة التي متثل املُكدّ س‪.‬‬ ‫ إذا كان ُم ِ‬ ‫عامل الدالة صف ًرا‪ُ ،‬يحذف العن صر األأول من القائمة التي متثل الطابور‪.‬‬ ‫مثااًل على تطبيق الطابور يف لغة البايثون‪:‬‬ ‫ سن ستعر ض لك ً‬ ‫ أن شئ طابورًا لتخزين جمموعة من األأرقام (‪.)45 ،32 ،21 ،1‬‬ ‫ ا ستخدم عملية حذف عن صر من الطابور مرتني حلذف العن صرين ا أأل َّولَني منه‪.‬‬ ‫ ا ستخدم عملية إ ضافة عن صر إىل الطابور إلإ ضافة عن صر جديد إليه‪.‬‬ ‫اخللفي األأمامي‬ ‫األأمامي‬ ‫اخللفي‬ ‫األأمامي‬ ‫اخللفي‬ ‫‪45‬‬ ‫‪32‬‬ ‫‪21‬‬ ‫‪45‬‬ ‫‪32‬‬ ‫‪21‬‬ ‫‪1‬‬ ‫‪45‬‬ ‫‪32‬‬ ‫‪21‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫حذف عن صر‬ ‫من الطابور‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫حذف عن صر‬ ‫من الطابور‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫اخللفي‬ ‫الطابور األأخير‬ ‫اخللفي األأمامي‬ ‫األأمامي‬ ‫‪78‬‬ ‫‪45‬‬ ‫‪32‬‬ ‫‪78‬‬ ‫‪45‬‬ ‫‪32‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫ إ ضافة عن صر‬ ‫للطابور‬ ‫‪1‬‬ ‫‪0‬‬ ‫ شكل ‪ :1.25‬مثال تو ضيحي ملفهوم الطابور‬ ‫‪35‬‬ ‫ كم ا فعل ت يف‬،‫ ستَ س تخدِ م قائم ة البايث ون لتنفي ذ هي كل الطاب ور‬،‫لربجم ة اخلط وات املو ضح ة باألأعل ى بلغ ة البايث ون‬.‫املُكدّ س‬ myQueue=[1,21,32,45] print("Initial queue: ", myQueue) myQueue.pop(0) myQueue.pop(0) print("The new queue after pop: ", myQueue) myQueue.append(78) print("The new queue after push: ", myQueue) Initial queue: [1, 21, 32, 45] The new queue after pop: [32, 45] The new queue after push: [32, 45, 78].‫عليك ًأواًل أن تُفرِ غ الطابور من العنا صر‬ َ ،‫لكي ت شاهد ما قد يحدث عندما حتاول حذف عن صر من طابور فارغ‬ myQueue=[1,21,32,45] print("Initial queue: ", myQueue) a=len(myQueue) print("size of queue ",a) # empty the queue for i in range(a): myQueue.pop(0) print(myQueue) myQueue.pop(0) Initial queue: [1, 21, 32, 45] size of queue 4 [] -------------------------------------------------------------------IndexError Traceback (most recent call last) Input In , in () 7 myQueue.pop() 8 print(myQueue) ----> 9 myQueue.pop() IndexError: pop from empty list ‫عليك أن تتحقق دومًا من وجود عنا صر يف‬.‫الطابور قبل حماولة حذف عن صر منه‬ ‫ظهر الخط أ ألأنك حاولت‬.‫حذف عن صر من طابور فارغ‬ 36 ‫تطبيقات على الطابور ‪Queue Applications‬‬ ‫أ ح د األأمثل ة عل ى تطبيق ات الطاب ور يف عل وم احلا س ب هو طابور الطباعة‪.‬على س بيل املثال‪ ،‬لديك معمل حا س ب به ‪ 30‬جهاز حا س ب‬ ‫مت صل نين بطابع ة واح دة‪.‬عندم ا يرغ ب الطلب ة يف طباع ة املُ س تندات‪ ،‬ست ش كّل مه ا ّم الطّ باع ِة طاب ورًا ملعاجلته ا وف ق قاع دة امل ُ ض اف‬ ‫أواًل (‪ ،)FIFO‬أي أنّ تل ك امله ام س تُنج ُز بالرتتي ب الزمن ي ال ذي أُر س لَت ب ه إىل الطابع ة‪.‬املهم ة املُر س لة ًأواًل س وف ُتطب ع‬ ‫أواًل َيخ رُج ً‬ ‫ ً‬ ‫قبل املهمة املُر س لة بعدها ولن ُتطبع املهمة يف نهاية الطابور قبل طباعة كل املهام التي قبلها‪.‬عندما تنتهي الطابعة من أحد األأوامر‪،‬‬ ‫ سوف تبحث يف الطابور ملعرِ فة ما إن كانت هناك أوامر أخرى ملعاجلتها‪.‬‬ ‫املُكدّ س والطابور با ستخدام وحدة الطابور النمطية‬ ‫‪Stack and Queue Using Queue Module‬‬ ‫ميكن اعتبار القائمة يف لغة البايثون مبثابة طابور وكذلك مُكدّ س‪.‬تُقدِّ م لغة البايثون الوحدة النمطية للطابور (‪)Queue Module‬‬ ‫وهي طريقة أخرى لتنفيذ هيكلَيّ البيانات املو ضحني‪.‬تت ضمن الوحدة النمطية للطابور بع ض الدوال اجلاهزة لال ستخدام التي ميكن‬ ‫تطبيقها على كل من املُكدّ س والطابور‪.‬‬ ‫جدول ‪ :1.5‬وظائف وحدة الطابور النمطية‬ ‫الو صف‬ ‫الوظيفة‬ ‫)(‪ queueName=queue.Queue‬تن شئ طابورًا جديدً ا ا سمه ‪.queueName‬‬ ‫ت ضيف العن صر ‪ x‬إىل الطابور‪.‬‬ ‫)‪queueName.put(x‬‬ ‫تعود بقيمة حجم الطابور‪.‬‬ ‫)(‪queueName.qsize‬‬ ‫تعر ض وحتذف العن صر األأول من الطابور والعن صر األأخري من املُكدّ س‪.‬‬ ‫)(‪queueName.get‬‬ ‫تع ود بقيم ة ‪ ( True‬صحي ح) إن كان الطاب ور ممتل ًئ ا‪ ،‬وقيم ة ‪( False‬خط أ)‬ ‫)(‪queueName.full‬‬ ‫ إن كان الطابور فارغً ا‪ ،‬وميكن تطبيقها على املُكدّ س كذلك‪.‬‬ ‫تع ود بقيم ة ‪ ( True‬صحي ح) إن كان الطاب ور فارغً ا والقيم ة ‪( False‬خط أ)‬ ‫)(‪queueName.empty‬‬ ‫ إن كان الطابور ممتلئًا‪ ،‬ميكن تطبيقها على املُكدّ س كذلك‪.‬‬ ‫تُ ستخدَم وظائف مكتبة الطابور مع كلٍ من امل ُكدّ س والطابور‪.‬‬ ‫ ست ِ‬ ‫َ ستخدم وحدة الطابور النمطية إلإن شاء طابور‪.‬‬ ‫يف هذا املثال عليك‪:‬‬ ‫ ا س ترياد مكتب ة الطاب ور (‪ )Queue‬ال س تخدام‬ ‫طُ رُق الطابور‪.‬‬ ‫ إن شاء طابور فارغ با سم ‪( myQueue‬طابوري)‪.‬‬ ‫ إ ضاف ة العنا ص ر ‪ e ،d ،c ،b ،a‬إىل الطاب ور‬ ‫‪( myQueue‬طابوري)‪.‬‬ ‫ طباعة عنا صر الطابور‪.‬‬ ‫عليك ا ستيراد وحدة‬ ‫الطابور في بداية‬ ‫المقطع البرمجي‪.‬‬ ‫* ‪from queue import‬‬ ‫)(‪myQueue = Queue‬‬ ‫‪# add the elements in the queue‬‬ ‫)"‪myQueue.put("a‬‬ ‫)"‪myQueue.put("b‬‬ ‫)"‪myQueue.put("c‬‬ ‫)"‪myQueue.put("d‬‬ ‫)"‪myQueue.put("e‬‬ ‫‪# print the elements of the queue‬‬ ‫‪for element in list(myQueue.queue):‬‬ ‫)‪print(element‬‬ ‫‪a‬‬ ‫‪b‬‬ ‫‪c‬‬ ‫‪d‬‬ ‫‪e‬‬ ‫‪37‬‬ ‫ ويف النهاية‬،‫ ثم اطبع هذه القي م‬،‫ أن ش ئ طاب ورًا مُك َّو ًن ا م ن خم س قي م يق وم املُ س تخدِ م ب إدخالها أثن اء تنفيذ الربنام ج‬.‫اطبع حجم الطابور‬ from queue import * myQueue = Queue() # the user enters the elements of the queue for i in range(5): for i in range(5): element=input("enter queue element: ") myQueue.put(element) # print the elements of the queue for element in list(myQueue.queue): print(element) print ("Queue size is: ",myQueue.qsize()) enter enter enter enter enter 5 f 12 b 23 Queue queue queue queue queue queue element: element: element: element: element: 5 f 12 b 23 size is: 5.‫ أن شئ برناجمً ا للتحقق مما إذا كان الطابور فارغً ا أم ممتلئًا‬ from queue import * myQueue = Queue() myQueue.put("a") myQueue.put("b") myQueue.put("c") myQueue.put("d") myQueue.put("e") checkFull=myQueue.full() print("Is the queue full? ", checkFull) checkEmpty= myQueue.empty() print("Is the queue empty? ", checkEmpty) Is the queue full? False Is the queue empty? False 38 ‫كما ذُ ِكر من قبل ف إن وحدة الطابور حتتوي على بع ض الوظائف اجلاهزة لال ستخدام مع املُكدّ س أو الطابور‪.‬اجلدول‬ ‫‪ 1.6‬يو ضح وظائف الوحدة التي ُمُيكن ا ستخدامها مع هيكل بيانات املُكدّ س‪.‬‬ ‫كد س‬ ‫للم ّ‬ ‫جدول ‪ :1.6‬وظائف الوحدة املُ ستخدمة ُ‬ ‫الو صف‬ ‫الوظيفة‬ ‫)(‪ stackName=queue.LifoQueue‬تن شئ مُكدّ سً ا جديدً ا ا سمه ‪.stackName‬‬ ‫)(‪stackName.get‬‬ ‫حتذف العن صر األأخري من املُكدّ س‪.‬‬ ‫ ستَ ستخدِ م وحدة الطابور إلإن شاء مُكدّ س فارغ‪.‬‬ ‫تذكّر أن العمليات يف امل ُكدّ س تعمل وفقًا‬ ‫أواًل (‪.)LIFO‬‬ ‫لقاعدة امل ُ ضاف آخرًا يَخرُج ً‬ ‫عند ا ستخدام دالة ‪ get‬مع الطابور‪،‬‬ ‫ ستَ ستنِد عمليات اال ستدعاء والطباعة إىل‬ ‫أواًل (‪.)FIFO‬‬ ‫أواًل يَخرُج ً‬ ‫قاعدة امل ُ ضاف ً‬ ‫* ‪from queue import‬‬ ‫)(‪myStack = LifoQueue‬‬ ‫)"‪myStack.put("a‬‬ ‫)"‪myStack.put("b‬‬ ‫)"‪myStack.put("c‬‬ ‫)"‪myStack.put("d‬‬ ‫)"‪myStack.put("e‬‬ ‫‪for i in range(5):‬‬ ‫)(‪k=myStack.get‬‬ ‫)‪print(k‬‬ ‫‪# empty the stack‬‬ ‫)(‪checkEmpty= myStack.empty‬‬ ‫)‪print("Is the stack empty?", checkEmpty‬‬ ‫‪e‬‬ ‫‪d‬‬ ‫‪c‬‬ ‫‪b‬‬ ‫‪a‬‬ ‫‪Is the stack empty? True‬‬ ‫مثال‪ :‬الطباعة ‪Print‬‬ ‫يظه ر أمام ك يف املث ال الت ايل حم اكاة لطاب ور الطباع ة يف الطابعة‪.‬عندما ي ِ‬ ‫ُر س ل املُ س ِ‬ ‫ تخدمون أوام ر طباعة‪ ،‬تُ ضاف‬ ‫ إىل طابور الطباعة‪.‬ت ِ‬ ‫َ ستخدم الطابعة هذا الطابور لتحديد امللف الذي س ُيطبع ًأواًل‪.‬‬ ‫ افرت ض أن س عة الطابع ة ه ي فق ط ‪ 7‬ملف ات‪ ،‬ولك ن يف الوق ت نف س ه‪ ،‬حتت اج إىل طباع ة ‪ 10‬ملف ات م ن املل ف ‪A‬‬ ‫ إىل امللف ‪.J‬‬ ‫ اكتب برناجمً ا ُمُيثّل طابور الطباعة منذ بدء أمر الطباعة األأول ‪ A‬حتى االنتهاء من كل أوامر الطباعة‪.‬‬ ‫ أ ضف اللبنة التي ت ؤكد أن طابور أوامر الطباعة فارغ‪.‬‬ ‫‪39‬‬ ‫متت طباعته‬ :‫ُمُيكنك ا ستخدام اخلوارزمية اآلآتية‬.‫ أن شئ طابور أوامر الطباعة‬1 ‫ يف‬G ‫ إىل‬A ‫ أدرِج امللفات من‬2.‫طابور أوامر الطباعة‬ A B C D E F G 0 1 2 3 4 5 6 B C D E F G H 0 1 2 3 4 5 6 C D E F G H I 0 1 2 3 4 5 6 D E F G H I J 0 1 2 3 4 5 6 D E F G H I J 0 1 2 3 4 5 6 A ‫متت طباعته‬ B ‫متت طباعته‬ C.H ‫ و أدرج امللف‬A ‫ أخرِ ج امللف‬ 3.I ‫ و أدرج امللف‬B ‫ أخرِ ج امللف‬ 4.J ‫ و أدرج امللف‬C ‫ أخرِ ج امللف‬ 5 ‫ أخرج امللفات التي متت طباعتها‬.‫) واحدً ا تلو اآلآخر‬D-E-F-G-H-I-J( 6 # import the queue library from queue import * # import the time library to use the sleep function import time # initialize the variables and the queue printDocument = " " printQueueSize = 0 printQueueMaxSize = 7 printQueue = Queue(printQueueMaxSize) # add a document to print the queue def addDocument(document): printQueueSize = printQueue.qsize() if printQueueSize == printQueueMaxSize: print("!! ", document, " was not sent to print queue.") print("The print queue is full.") print() return printQueue.put(document) time.sleep(0.5) #Wait 5.0 seconds print(document, " sent to print queue.") printQueueSizeMessage() # print a document from the print queue def printDocument(): printQueueSize = printQueue.qsize() if printQueueSize == 0: print("!! The print queue is empty.") 40 print() return printDocument = printQueue.get() time.sleep(1) # wait one second print ("OK - ", printDocument, " is printed.") printQueueSizeMessage() # print a message with the size of the queue def printQueueSizeMessage(): printQueueSize = printQueue.qsize() if printQueueSize == 0: print ("There are no documents waiting for printing.") elif printQueueSize == 1: print ("There is 1 document waiting for printing.") else: print ("There are ", printQueueSize, " documents waiting for printing.") print() # the main program # send documents to the print queue for printing addDocument("Document addDocument("Document addDocument("Document addDocument("Document addDocument("Document addDocument("Document addDocument("Document printDocument() addDocument("Document printDocument() addDocument("Document printDocument() addDocument("Document addDocument("Document printDocument() printDocument() printDocument() printDocument() printDocument() printDocument() printDocument() printDocument() A") B") C") D") E") F") G") H") I") J") K") Document A sent to print queue. There is 1 document waiting for printing. Document B sent to print queue. There are 2 documents waiting for printing. Document C sent to print queue. There are 3 documents waiting for printing. 41 Document D sent to print queue. There are 4 documents waiting for printing. Document E sent to print queue. There are 5 documents waiting for printing. Document F sent to print queue. There are 6 documents waiting for printing. Document G sent to print queue. There are 7 documents waiting for printing. OK - Document A is printed. There are 6 documents waiting for printing. Document H sent to print queue. There are 7 documents waiting for printing. OK - Document B is printed. There are 6 documents waiting for printing. Document I sent to print queue. There are 7 documents waiting for printing. OK - Document C is printed. There are 6 documents waiting for printing. Document J sent to print queue. There are 7 documents waiting for printing. !! Document K was not sent to print queue. The print queue is full. OK - Document D is printed. There are 6 documents waiting for printing. OK - Document E is printed. There are 5 documents waiting for printing. OK - Document F is printed. There are 4 documents waiting for printing. OK - Document G is printed. There are 3 documents waiting for printing. OK - Document H is printed. There are 2 documents waiting for printing. OK - Document I is printed. There is 1 document waiting for printing. OK - Document J is printed. There are no documents waiting for printing. !! The print queue is empty. 42 ‫هياكل البيانات الثابتة واملتغرية ‪Static and Dynamic Data Structures‬‬ ‫ س بق تو ضيح أن هياكل البيانات هي طريقة فعالة لتخزين البيانات وتنظيمها‪ ،‬وباإلإ ضافة إىل ما تعلمته حول ت صنيف هياكل‬ ‫أي ضا إىل ثابتة (‪ )Static‬و متغرية (‪.)Dynamic‬‬ ‫البيانات إىل أوليّة وغري أوليّة‪ ،‬ف إنه ميكن ت صنيفها ً‬ ‫هياكل البيانات الثابتة ‪Static Data Structure‬‬ ‫يف البيان ات الثابت ة‪ ،‬يك ون حج م الهي كل ثاب ًت ا‪ ،‬و ُتخ زَّن عنا ص ر البيان ات يف مواق ع الذاك رة املتج اورة‪ُ.‬تع ُّد امل صفوف ة‬ ‫(‪ )Array‬املثال األأبرز لهياكل البيانات الثابتة‪.‬‬ ‫هياكل البيانات املتغرية ‪Dynamic Data Structure‬‬ ‫يف هي اكل البيان ات املتغ ريرة‪ ،‬ال يك ون حج م الهي كل ثاب ًت ا ولك ن ميك ن تعديل ه أثن اء تنفي ذ الربنام ج‪ ،‬ح س ب العملي ات‬ ‫املُن َّف ذة علي ه‪.‬تُ ص َّم م هي اكل البيان ات املتغ ريرة لت س هيل تغي رير حج م هي اكل البيان ات أثن اء الت ش غيل‪.‬و ُتع ُّد القائم ة‬ ‫املرتابطة (‪ )Linked List‬املثال األأبرز لهياكل البيانات املتغرية‪.‬‬ ‫جدول ‪ :1.7‬مقارنة بني هياكل البيانات الثابتة واملتغرية‬ ‫الثابتة‬ ‫حجم الذاكرة ثابت‪.‬‬ ‫حجم الذاكرة‬ ‫ُتخ زَّن العنا ص ر يف مواقع متجاورة‬ ‫ أنواع ذاكرة التخزين‬ ‫يف الذاكرة الرئي سة‪.‬‬ ‫ سرعة الو صول إىل البيانات أ سرع‪.‬‬ ‫املتغرية‬ ‫ميكن تغيري حجم الذاكرة أثناء الت شغيل‪.‬‬ ‫ُتخ َّزن العنا ص ر يف مواق ع ع ش وائية يف الذاك رة‬ ‫الرئي سة‪.‬‬ ‫ أبط أ‪.‬‬ ‫تخ صي ص الذاكرة ‪Memory Allocation‬‬ ‫تنتم ي القوائ م املرتابط ة (‪ )Linked Lists‬إىل هي اكل البيان ات املتغ ريرة‪ ،‬وه ذا يعن ي أن عُ ق د القائم ة املرتابط ة ال ُتخ زَّن يف‬ ‫مواقع الذاكرة املتجاورة مثل البيانات يف امل صفوفات‪.‬ولهذا ال سبب‪ ،‬حتتاج إىل تخزين امل ؤ شر من عُ قدة إىل أخرى‪.‬‬ ‫الثابتة‬ ‫= بايت واحد من الذاكرة املُ ستخدَ مة‬ ‫‪5‬‬ ‫‪4‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫املتغرية‬ ‫= بايت واحد من الذاكرة املُ ستخدَ مة‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪5‬‬ ‫‪4‬‬ ‫حتتاج امل صفوفات إىل لبنة ذاكرة متجاورة‪.‬‬ ‫ال حتتاج القوائم املرتابطة إىل أن تكون متجاورة‬ ‫يف الذاكرة ولكن يزداد حجمها بطريقة متغرية‪.‬‬ ‫ شكل ‪ :1.26‬مثال على تخ صي صيّ الذاكرة الثابتة واملتغرية‪.‬‬ ‫‪43‬‬ ‫القائمة املرتابطة ‪Linked List‬‬ ‫القائم ة املرتابط ة ه ي ن وع م ن هي اكل البيان ات اخلط َّي ة‪ ،‬وه ي واح دة م ن هي اكل‬ ‫البيان ات األأك رثر ش هرة يف الربجم ة‪.‬القائم ة املرتابط ة ت ش به سل س لة م ن ال ُعق د‪.‬‬ ‫حتت وي كل عُ ق دة عل ى حقل نين‪ :‬حق ل البيان ات حي ث ُتخ زن البيان ات‪ ،‬وحق ل يحتوي‬ ‫عل ى امل ؤ ش ر ال ذي ُي ش رير إىل ال ُعق دة التالي ة‪ُ.‬ي س تثنى م ن هذا ال ُعق دة األأخرية التي‬ ‫ال يحم ل فيه ا حق ل العن وان أي بيان ات‪.‬إ ح دى مزاي ا القائم ة املرتابط ة ه ي أن‬ ‫حجمها يزداد أو يقل ب إ ضافة أو حذف ال ُعقد‪.‬‬ ‫القيمة الفارغة‬ ‫(‪)Null‬‬ ‫الر أ س‬ ‫(‪)Head‬‬ ‫القائمة املرتابطة‬ ‫‪-2‬‬ ‫‪ABC‬‬ ‫‪7.2‬‬ ‫‪5‬‬ ‫ شكل ‪ :1.27‬ر سم تو ضيحي للقائمة املرتابطة‬ ‫القائمة املرتابطة (‪:)Linked List‬‬ ‫القائم ة املرتابط ة ه ي ن وع م ن هي اكل‬ ‫البيان ات اخلط َّي ة الت ي ت ش به سل س لة م ن‬ ‫العُقد‪.‬‬ ‫العُقدة (‪:)Node‬‬ ‫ال ُعق دة ه ي اللبن ة الفردي ة املُك ِّون ة لهي كل‬ ‫البيان ات وحتت وي عل ى البيان ات وراب ط‬ ‫واح د أو أ ك رثر م ن الرواب ط الت ي تربطه ا‬ ‫بالعُقد األأخرى‪.‬‬ ‫العُقدة ‪Node‬‬ ‫تتكون كل عُ قدة يف القائمة املرتابطة من جزئني‪:‬‬ ‫ اجلزء األأول يحتوي على البيانات‪.‬‬ ‫ اجلزء الثاين يحتوي على م ؤ شر يُ شري إىل العُقدة التالية‪.‬‬ ‫‪12‬‬ ‫م ؤ شر إلى العُقدة التالية‪.‬‬ ‫لقراءة حمتوى عُقدة حمددة‪ ،‬عليك‬ ‫املرور على كل العُقد ال سابقة‪.‬‬ ‫ شكل ‪ :1.28‬ر سم تو ضيحي للعُقد‬ ‫مثااًل على القائمة املرتابطة لألأعداد ال صحيحة‪.‬‬ ‫لت شاهد ً‬ ‫تتكون القائمة املرتابطة من خم س عُ قد‪.‬‬ ‫القيمة الفارغة‬ ‫‪21‬‬ ‫الر أ س‬ ‫‪95‬‬ ‫حقل البيانات‪.‬‬ ‫‪1‬‬ ‫‪12‬‬ ‫‪3‬‬ ‫القيمة الفارغة تعني أنها‬ ‫بال قيمة‪ ،‬أو غري ُحُمدَّدة‪ ،‬أو‬ ‫فارغة‪.‬على الرغم من أنه يف‬ ‫بع ض األأحيان ن ستخدم الرقم‬ ‫‪ 0‬لإلإ شارة إىل القيمة الفارغة‪،‬‬ ‫ إال أنه رقم حمدَّد وقد ي شري‬ ‫ إىل قيمة حقيقية‪.‬‬ ‫ شكل ‪ :1.29‬ر سم تو ضيحي ُمُيثّل قائمة مرتابطة لألأعداد ال صحيحة‬ ‫ال ُعق د يف القائم ة ال يك ون له ا ا س م‪ ،‬وم ا تعرف ه عنها هو عنوانها (املوقع الذي تخزن في ة العُقدة يف الذاكرة)‪.‬للو صول‬ ‫ إىل أي عُ ق دة بالقائم ة‪ ،‬حتت اج فق ط إىل معرف ة عن وان ال ُعق دة األأوىل‪.‬ث م تتب ع سل س لة ال ُعق د للو ص ول إىل ال ُعق دة‬ ‫املطلوبة‪.‬‬ ‫‪44‬‬ ‫عل ى س بيل املث ال‪ ،‬إن كن ت ترغب يف الو ص ول إىل العُقدة الثالثة‬ ‫يف القائم ة ملعاجل ة البيان ات التي حتتوي عليها‪ ،‬عليك البدء من‬ ‫ال ُعق دة األأوىل يف القائم ة‪ ،‬وم ن ال ُعق دة األأوىل للو ص ول إىل‬ ‫الثانية‪ ،‬ومن الثانية للو صول إىل الثالثة‪.‬‬ ‫ عنوان العُقدة األأوىل ُخُمزَّن يف مُتغري خا ص (مُ ستقِل) يُطلق‬ ‫عليه عاد ًة الر أ س (‪.)Head‬‬ ‫ قيمة م ؤ شر العُقدة األأخرية يف القائمة قيمة فارغة (‪،)Null‬‬ ‫ُومُيثَّل بالرمز ‪.‬‬ ‫ عندما تكون القائمة فارغة‪ ،‬ي ش رير م ؤ ش ر الر أ س إىل القيمة‬ ‫الفارغة (‪.)Null‬‬ ‫الر أ س‬ ‫القيم الفارغة‬ ‫‪25‬‬ ‫‪30‬‬ ‫العُقدة الثالثة‬ ‫‪15‬‬ ‫العُقدة الثانية‬ ‫العُقدة األأوىل‬ ‫ شكل ‪ :1.30‬الو صول إىل العُقدة الثالثة يف القائمة املرتابطة‬ ‫ إلي ك مث ً ااًل تو ضيح ًي ا عل ى القائم ة املرتابط ة يف ش كل ‪ ،1.31‬كما ذُ ك ر من قبل ف إن كل عُ قدة تتكون من بيانات وم ؤ ش ر‬ ‫ي شري إىل ال ُعقدة التالية‪ ،‬بحيث تُخزّن كل عُ قدة يف الذاكرة يف عنوان ُحُم َّدد‪.‬‬ ‫لرنب ط ال ُعق دة ال س ابقة بال ُعق دة التالي ة بقيم ة بيان ات ‪،42‬‬ ‫الت ي بدوره ا تُ ش رير إىل ال ُعق دة الثالث ة واألأخ ريرة عن د عن وان‬ ‫‪ 30‬بقيمة بيانات ‪.37‬‬ ‫‪37‬‬ ‫‪30‬‬ ‫‪30‬‬ ‫‪42‬‬ ‫‪20‬‬ ‫‪20‬‬ ‫‪15‬‬ ‫مثال على العُقدة‪:‬‬ ‫ بيانات العُقدة هي الرقم ‪.15‬‬ ‫ عنوان العُقدة يف الذاكرة هو ‪.10‬‬ ‫ عنوان العُقدة التالية هو ‪.20‬‬ ‫‪10‬‬ ‫‪20‬‬ ‫العنوان التايل‬ ‫‪15‬‬ ‫البيانات‬ ‫‪10‬‬ ‫العنوان‪/‬الر أ س‬ ‫ شكل ‪ :1.31‬امل ؤ شرات يف القائمة املرتابطة‬ ‫جدول ‪ :1.8‬االختالفات بني القائمة والقائمة املرتابطة‬ ‫القائمة‬ ‫االختالفات‬ ‫طريقة تخزين الذاكرة املواقع متجاورة يف الذاكرة‪.‬‬ ‫ميكن الو صول إىل كل عن صر برقم‬ ‫الهيكل‬ ‫الفهر س (‪.)Index‬‬ ‫يُخ َّزن كل عن صر تلو اآلآخر‪.‬‬ ‫احلجم‬ ‫القائمة املرتابطة‬ ‫املواقع ع شوائية يف الذاكرة‪.‬‬ ‫ميكن الو صول إىل العنا صر من خالل امل ؤ شر‬ ‫(‪.)Pointer‬‬ ‫ُتخ زَّن الكائن ات يف ص ورة عُ ق د حتت وي عل ى‬ ‫البيانات وعنوان العن صر التايل‪.‬‬ ‫تُخ َّزن البيانات وامل ؤ شرات يف الذاكرة‪.‬‬ ‫تُخ َّزن البيانات وحدَ ها يف الذاكرة‪.‬‬ ‫ا ستخدام الذاكرة‬ ‫نوع الو صول إىل البيانات الو صول الع شوائي إىل أي عن صر بالقائمة‪.‬الو صول املت سل سل إىل العنا صر‪.‬‬ ‫ سرعة إ ضافة العنا صر وحذفها‪.‬‬ ‫ سرعة اإلإ ضافة واحلذف بطء إ ضافة العنا صر وحذفها‪.‬‬ ‫‪45‬‬ ‫القائمة املرتابطة يف لغة البايثون ‪Linked List in Python‬‬ ‫ال تُوف ر لغ ة البايث ون ن وع بيان ات ُحُم َّدد ُم س بقًا للقوائ م املرتابطة‪.‬عليك إن ش اء نوع البيانات‬ ‫متثياًل لهذا النوع من البيانات‪.‬إلإن شاء‬ ‫اخلا ص بك‪ ،‬أو ا ستخدام مكتبات البايثون التي توفر ً‬ ‫قائم ة مرتابط ة‪ ،‬ا س تخدم فئ ات البايث ون‪.‬يف املث ال املو ض ح بال ش كل ‪ ،1.32‬ستُن ش ئ قائم ة‬ ‫مرتابطة مكونة من ثالث ُعقد‪ ،‬كل واحدة ت ضم يومً ا من أيام األأ سبوع‪.‬‬ ‫‪Wednesday‬‬ ‫‪Tuesday‬‬ ‫ شكل ‪ :1.32‬مثال على القائمة املرتابطة‬ ‫‪Monday‬‬ ‫الفئة (‪:)Class‬‬ ‫الفئ ة ه ي هي كل بيان ات مع رّف‬ ‫بوا س طة امل س تخدم‪ ،‬ويحت وي‬ ‫عل ى أع ضاء البيانات (ال س مات‬ ‫‪ ،)Properties‬والطرا ئ ق‬ ‫( ا ل س لو ك ‪)B e h a v i o r‬‬ ‫اخلا ص ة بها‪.‬وتُ س تخدَ م الفئات‬ ‫كقوالب إلإن شاء الكائنات‪.‬‬ ‫ ستُن شئ ًأواًل عُ قدة با ستخدام الفئة‪.‬‬ ‫‪# single node‬‬ ‫‪class Node:‬‬ ‫‪def __init__(self, data, next=None):‬‬ ‫‪self.data = data # node data‬‬ ‫‪self.next = next # Pointer to the next node‬‬ ‫‪# Create a single node‬‬ ‫)"‪first = Node("Monday‬‬ ‫)‪print(first.data‬‬ ‫‪Monday‬‬ ‫اخلطوة التالية هي إن ش اء قائمة مرتابطة حتتوي على عُ قدة واحدة‪ ،‬وهذه املرة ستَ س تخدِ م م ؤ ش ر الر أ س لإلإ ش ارة إىل‬ ‫العُقدة األأوىل‪.‬‬ ‫‪# single node‬‬ ‫‪class Node:‬‬ ‫‪def __init__(self, data = None, next=None):‬‬ ‫‪self.data = data‬‬ ‫‪self.next = next‬‬ ‫‪# linked list with one head node‬‬ ‫‪class LinkedList:‬‬ ‫‪def __init__(self):‬‬ ‫‪self.head = None‬‬ ‫‪# list linked with a single node‬‬ ‫)(‪Linkedlist1 = LinkedList‬‬ ‫)"‪Linkedlist1.head = Node("Monday‬‬ ‫)‪print(Linkedlist1.head.data‬‬ ‫‪Monday‬‬ ‫‪46‬‬ ‫ ِأ ض ْف اآلآن املزيد من العُقد إىل القائمة املرتابطة‪.‬‬ ‫‪# single node‬‬ ‫‪class Node:‬‬ ‫‪def __init__(self, data = None, next=None):‬‬ ‫‪self.data = data‬‬ ‫‪self.next = next‬‬ ‫‪# an empty linked list with a head node.‬‬ ‫‪class LinkedList:‬‬ ‫‪def __init__(self):‬‬ ‫‪self.head = None‬‬ ‫‪# the main program‬‬ ‫)(‪linked_list = LinkedList‬‬ ‫‪# the first node‬‬ ‫)"‪linked_list.head = Node("Monday‬‬ ‫‪# the second node‬‬ ‫)"‪linked_list.head.next = Node("Tuesday‬‬ ‫‪# the third node‬‬ ‫)"‪linked_list.head.next.next = Node("Wednesday‬‬ ‫‪# print the linked list‬‬ ‫‪node = linked_list.head‬‬ ‫‪while node:‬‬ ‫)‪print (node.data‬‬ ‫‪node = node.next‬‬ ‫تُ ستخدَ م عبارة ‪ while‬للتنقل من عُ قدة‬ ‫ إلى أخرى‪.‬‬ ‫‪Monday‬‬ ‫‪Tuesday‬‬ ‫‪Wednesday‬‬ ‫ إ ضافة العُقدة إىل القائمة املرتابطة‬ ‫‪99‬‬ ‫‪Add a Node to a Linked List‬‬ ‫لتتمكن من إ ضافة عُ قدة جديدة‪ ،‬اتبع اخلطوات التالية‪:‬‬ ‫ يج ب أن يُ ش رير م ؤ ش ر ال ُعق دة األأوىل إىل عن وان ال ُعق دة اجلدي دة‪ ،‬حت ى‬ ‫ت صبح العُقدة اجلديدة هي العُقدة الثانية‪.‬‬ ‫ يجب أن يُ شري م ؤ شر العُقدة اجلديدة (الثانية) إىل عنوان العُقدة الثالثة‪.‬‬ ‫به ذه الطريق ة‪ ،‬ل ن حتت اج إىل تغي رير العنا ص ر عن د إ ضاف ة عن ص ر جدي د يف‬ ‫املنت ص ف‪.‬تقت ص ر العملي ة عل ى تغيري ِقيَم العناوين يف العُقدة التي تُ س رِّع من‬ ‫عملية اإلإ ضافة يف حالة القوائم املرتابطة‪ ،‬مقارنًة بحالة القوائم املت سل سلة‪.‬‬ ‫مثال‪:‬‬ ‫‪12‬‬ ‫‪node‬‬ ‫‪node.next‬‬ ‫‪ .1‬أن ش ئ ال ُعق دة‬ ‫اجلديدة‪.‬‬ ‫‪99‬‬ ‫‪node.next.next‬‬ ‫لدي ك قائم ة مرتابط ة م ن عن صري ن‪ 12 :‬و‪ ،99‬وتري د إدراج العن ص ر ‪ 37‬كعن ص ر‬ ‫ثانٍ بالقائمة‪.‬يف النهاية‪ ،‬سيكون لديك قائمة من ثالثة عنا صر‪ 12 :‬و‪ 37‬و‪.99‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪37‬‬ ‫‪37‬‬ ‫‪3‬‬ ‫‪node.next‬‬ ‫‪12‬‬ ‫‪node‬‬ ‫‪.2‬اربُط العُقدة ‪ 37‬بالعُقدة ‪.99‬‬ ‫‪.3‬ار ُب ط ال ُعق دة ‪ 12‬بال ُعق دة ‪37‬‬ ‫(متت إ ضافة العُقدة اجلديدة)‪.‬‬ ‫‪47‬‬ # single node class Node: def __init__(self, data = None, next=None): self.data = data self.next = next # linked list with one head node class LinkedList: def __init__(self): self.head = None def insertAfter(new, prev): # create the new node new_node = Node(new) # make the next of the new node the same as the next of the previous node new_node.next = prev.next # make the next of the previous node the new node prev.next = new_node # create the linked list L_list = LinkedList() # add the first two nodes L_list.head = Node(12) second = Node(99) L_list.head.next = second # insert the new node after node 12 (the head of the list) insertAfter(37, L_list.head) # print the linked list node = L_list.head while node: print (node.data) node = node.next 12 37 99 Delete a Node from a Linked List ‫حذف العُقدة من القائمة املرتابطة‬.‫ عليك تغيري ُم ؤ شر العُقدة التي ت سبق العُقدة املراد حذفها إىل م ؤ شر العُقدة التي تلي العُقدة املحذوفة‬،‫حلذف عُ قدة‬ ‫خ ص ص م س احة الذاكرة‬ َّ ‫) و س ُت‬Useless Data( ‫ أ صبح ت ال ُعق دة املحذوف ة (الثاني ة) عب ارة ع ن بيانات غري ُمفيدة‬.‫التي ت شغلها ال ستخدامات أخرى‬ :‫مثال‬ ‫ س يكون لدي ك‬،‫ يف النهاي ة‬.37 ‫ وترغ ب يف ح ذف العن ص ر‬،99‫ و‬37‫ و‬12 :‫لدي ك قائم ة مرتابط ة م ن ثالث ة عنا ص ر‬.99‫ و‬12 :‫قائمة من عن صرين‬ 48 # single node class Node: def __init__(self, data = None, next=None): self.data = data self.next = next # linked list with one head node class LinkedList: def __init__(self): self.head = None def deleteNode(key, follow): # store the head node 12 37 99 node node.next node.next.next.99 ‫ بالعُقدة‬12 ‫اربُط م ؤ شر العُقدة‬.1.37 ‫ احذف العُقدة‬.2 1 12 node node.next temp = follow.head 37 # find the key to be deleted, # the trace of the previous node to be changed while(temp is not None): if temp.data == key: break prev = temp temp = temp.next # unlink the node from the linked list prev.next = temp.next temp = None 99 2 node.next ‫النتيجة النهائية‬.3 12 99 node node.next 3 # create the linked list L_list = LinkedList() # add the first three nodes L_list.head = Node(12) second = Node(37) third = Node(99) L_list.head.next = second second.next = third # delete node 37 deleteNode(37,L_list) # print the linked list node = L_list.head while node: print (node.data) node = node.next 12 99 49 ‫ إذا كنت تريد حذف العُقدة األأوىل من‬ ‫ عليك نقل م ؤ شر‬،‫القائمة املرتابطة‬.‫الر أ س إىل العُقدة الثانية من القائمة‬

Use Quizgecko on...
Browser
Browser