اتحاد طلبة هندسة الحاسوب والشبكات - المدونه الرسميه C.N.E : Data Structures - Revision

المشاركات الشائعة

Data Structures - Revision


يُمثل الclass نموذجاً غير قابل للإستخدام .. للإستفادة من هذا الclass لا بد من عمل نسخة عنه (object).

تُشبه هذه العملية مصنع السيارات ,, حيث يوجد نموذج واحد تتم بناء كل السيارات عنه ,, هذا النموذج لا يُمكن للمستخدم التعامل معه ,, ولكن يُمكن للمصنع ان يُنتج عدد لا نهائي من السيارات عن هذا النموذج ,, بحيث تشكل هذه السيارات نسخ منفصلة ذات مواصفات مُطابقة للمواصفات المتواجدة في النموذج الأصلي ... كل سيارة لها مقود ومقاعد وهيكل وأبواب .. الخ وهذه الأشياء تشبه الموجودة في النموذج الا انها لا تعتمد على بعضها البعض ,, مما يعني انه لا علاقة بين مقاعد السيارة A ومقاعد السيارة B.

إنه نفس الحال بالنسبة للobjects .. لا توجد علاقة بين قيمة المتغير X في الobject A وقيمة المتغير X في الobject B.

**************************************************


يُستخدم الtemplate في البرمجة لكي نختصر الوقت والجهد بحيث لا نكون بحاجة لكتابة نفس الclass عدة مرات لكي نستخدم انواع متغيرات مختلفة في كل مرة (class يستخدم الint وclass يستخدم الdouble و class يستخدم الchar ... الخ), كل ما علينا فعله هو كتابة class واحد مسبوق بجملة الtemplate .. وبذلك تكون انواع المتغيرات معممه في الclass.

عملية تحديد اذا كان نوع المتغيرات int, double, char ... الخ تتم داخل الmain وذلك من خلال الجملة التي يتم فيها الإعلان عن الobject.

**************************************************

الstruct هو بناء برمجي شبيه بالclass ولكن الفرق بينهما هو:

الaccess modifier الإفتراضي الخاص بتعليمات الclass هو private ... مما يعني انه في حال عدم كتابة اي access modifier داخل الclass فإن كل التعليمات المكتوبة داخل الclass هي private (في حال تواجد object من الclass فإنه لا يُمكن التعامل مع هذه التعليمات خارج بناء الobject أو غير مرئية لأي شيء مكتوب خارج بناء الobject).

الaccess modifier الإفتراضي الخاص بتعليمات الstruct هو public ... مما يعني انه في حال عدم كتابة اي access modifier داخل الstruct فإن كل التعليمات المكتوبة داخل الstruct هي public (يُمكن التعامل معها خارج بناء الstruct أو مرئية لأي شيء مكتوب خارج بناء الstruct).

يُستخدم الstruct عادة لإنشاء العناصر عند التعامل مع الlinked-list أو الBST ويحتوي عادة على متغير يُخزن فيه القيمة الخاصة بالعنصر ويحتوي على مؤشر لربط العنصر إلى العنصر الذي يليه.

**************************************************

يحتوي كل class على constructor واحد على الأقل وdestructor واحد على الأكثر

يتميز الconstructor عن غيره من الإقترانات بأن له نفس اسم الclass, ليس له نوع بيانات لإرجاعها ... يوجد constructor واحد افتراضي بحيث تكون اقواسه خاليه بينما يُمكن ان يتواجد عدد لا نهائي من الconstructors المنسوخة والتي تحتوي اقواسها على انواع بيانات لكي يتم تمرير قيم داخل الconstructor ... يتم استدعاء الconstructor تلقائياً عند الإعلان عن object داخل الmain ,, وعملية اختيار الconstructor الذي سيتم استدعاؤه تعتمد على محتوى الأقواس في جملة الإعلان عن الobject.

يتميز الdestructor عن غيره من الإقترانات بان له نفس اسم الclass لكنه مسبوق برمز ~ , ليس له نوع بيانات لإرجاعها ... يوجد destructor واحد فقط لكل class وأقواسه خاليه ... يتم استدعاء الdestructor تلقائياً عندما تنتهي فترة حياة الobject  وعادة يحتوي على تعليمات تقوم بتدمير ما تم بناؤه في الobject منذ الإعلان عنه بهدف تحرير الذاكرة من القيم المحجوزة فيها ... تبدأ فترة حياة الobject عند الإعلان عنه وتنتهي عند الوصول إلى اغلاق القوس ( } ) حيث كتبت جملة الإعلان (مثلاً تم الإعلان عن الobject داخل الmain ,, تنتهي حياته عندما نصل بالتنفيذ الى اغلاق اقواس الmain).

**************************************************

بعد الإعلان عن الobject يتم تنفيذ التعليمات الموجودة داخل الconstructor المستدعى تلقائياً فقط ,, ولا يتم تنفيذ اي شيء اخر في حال لم يتم استدعاؤه.

**************************************************

الstack هو بناء يكون فيه ترتيب العناصر من نوع الداخل اخراً خارج أولاً (LIFO) .. نحتاج لمؤشر واحد في الstack بحيث يُشير الى اخر عنصر تمت اضافته وعادةً يُسمى top ,, ونحتاج لمُتغير يُعبر عن عدد العناصر الموجودة في الstack وعادة يُسمى length.

عملية الإضافة إلى الstack تسمى push بينما تُسمى عملية السحب pop .. يُفترض بعملية push ان تزيد قيمة الlength بمقدار 1 بينما تقوم عملية الpop بإنقاص قيمة الlength بمقدار 1 مع ابقاء الtop مؤشراً على العنصر الموجود في قمة الstack.

بدايةً يكون الtop يؤشر على NULL وتكون قيمة length تساوي 0 لأن الstack فارغة ... عند اضافة أول عنصر نجعل الtop يؤشر عليه وتصبح قيمة الlength تساوي 1 ... ثم لإضافة أي عنصر نجعل الnext للعنصر المضاف يؤشر على الtop ثم نقوم بتحريك الtop إلى العنصر الجديد ونزيد قيمة الlength.

لا يُمكنك حذف العنصر الموجود في قاع ال
stack حتى تقوم بحذف جميع العناصر التي تعلوه وهذه العملية تُؤثر في قيمة length ومؤشر top .. ولكن يُمكنك طباعة قيم جميع العناصر مثلاً دون ان تقوم بحذف أي عنصر وذلك بإنشاء مؤشر مؤقت وليكن temp بحيث يؤشر على نفس العنصر الذي يؤشر top عليه .. ثم نطبع قيم كامل العناصر من خلال جملة for ,, بحيث في كل مرة نطبع قيمة العنصر من خلال cout<<temp->data ,, وعملية الزيادة تكون بجعل الtemp يؤشر على الtemp->next بمعنى ان تكون الجملة البرمجية temp=temp->next ,, ويكون الشرط سامحاً بالمتابعة اذا كان temp!=NULL.

**************************************************

الqueue هو بناء يكون فيه ترتيب العناصر من نوع الداخل اولاً خارج اولاً (FIFO) .. نحتاج لمؤشرين في هذه الحالة يحيث يكون احدهما مؤشراً إلى بداية الqueue وهو الfront ,, والاخر يكون مؤشراً إلى نهاية الqueue وهو الrear ,, ونحتاج الى متغير يُعبر عن عدد العناصر المتواجدة في الqueue وعادةً يُسمى length.

عملية الإضافة إلى الqueue تسمى enqueue وعملية السحب من الqueue تسمى dequeue .. يُفترض بعملية الenqueue ان تزيد قيمة الlength بمقدار 1 وتحرك مؤشر الrear ,, بينما تقوم عملية الdequeue بإنقاص قيمة الlength بمقدار 1 وتحرك مؤشر الfront.

بدايةً يكون كلاً من الfront والrear يؤشران على NULL وتكون قيمة length تساوي 0 لأن الqueue فارغة ... عند اضافة أول عنصر نجعل كلاً من front وrear يؤشران عليه وتصبح قيمة الlength تساوي 1 ... ثم لإضافة العنصر الثاني نجعل الrear يؤشر على العنصر المضاف ويبقى الfront على أول عنصر وتصبح قيمة الlength تساوي 2 ونجعل الnext للعنصر المضاف يؤشر على أول عنصر newnode->next=front ... بعد ذلك لإضافة أي عنصر 
نجعل الnext للعنصر المضاف يؤشر على الrear ثم نقوم بتحريك الrear إلى العنصر الجديد ونزيد قيمة الlength.

لا يمكنك حذف العنصر الموجود في الrear الإ بعد حذف كامل العناصر الموجودة في الqueue وذلك بالتأثير على قيمة الlength ومؤشر الfront .. 
ولكن يُمكنك طباعة قيم جميع العناصر مثلاً دون ان تقوم بحذف أي عنصر وذلك بإنشاء مؤشر مؤقت وليكن temp بحيث يؤشر على نفس العنصر الذي يؤشر rear عليه .. ثم نطبع قيم كامل العناصر من خلال جملة for ,, بحيث في كل مرة نطبع قيمة العنصر من خلال cout<<temp->data ,, وعملية الزيادة تكون بجعل الtemp يؤشر على الtemp->next بمعنى ان تكون الجملة البرمجية temp=temp->next ,, ويكون الشرط سامحاً بالمتابعة اذا كان temp!=NULL.

**************************************************
سامر المناصرة
< >

ليست هناك تعليقات:

إرسال تعليق