وليد الشهري
وليد الشهري

@Waleed_S_7

24 تغريدة 54 قراءة Aug 16, 2022
في الصور المرفقة برنامج مكوّن من 100 سطر بلغة "جافا"، وهو عبارة عن تطبيق لمفهوم المكدِّس (stack) على مصفوفة.. سأشرح في هذه السلسلة كل سطر في البرنامج بأبسط عبارة ممكنة بحيث تكون مفهومة للجميع إن شاء الله، وسأكتفي بالإشارة إلى رقم السطر (1 = السطر الأول..وهكذا)، لنبدأ..
1- استيراد (import) لكلاس "Scanner" الموجود ضمن حزمة "java.util".. وهذا الكلاس متخصص في استقبال المدخلات من المستخدم، وقد استوردناه هنا لأننا نريد أن نترك مسألة تحديد عناصر بيانات المكدِّس للمستخدم، ولن نحددها نحن كمبرمجين.
2- أنشأنا "كلاس" باسم "Stack"، يحتوي عمومًا على أربع دوالّ، هي:
isEmpty()
للتحقق مما إذا كان المكدّس فارغًا.
push()
لإضافة عنصر بيانات جديد إلى المكدّس.
pop()
لحذف عنصر بيانات موجود في المكدّس.
display()
لعرض جميع عناصر البيانات في المكدّس.
3- قوس فتح "الكلاس".
4- متغيّر من نوع "عدد صحيح"، باسم "top"، بحيث تكون قيمته هي عنوان أعلى عنصر في المكدّس.
5- متغيّر من نوع "عدد صحيح"، باسم "maxsize"، بحيث تكون قيمته هي أقصى عدد ممكن من عناصر البيانات في المكدّس، وقيمته هي 10 (بمعنى أنّ المكدّس لن يقبل أكثر من 10 عناصر).
6- مصفوفة من نوع "عدد صحيح"، باسم "arr"، وقد حدّدنا مساحة المصفوفة بكتابة اسم المتغيّر "maxsize" داخل الأقواس المربّعة، أي أنّ المصفوفة لن تتسع لأكثر من 10 عناصر (لنتذكّر أن قيمة المتغير "maxsize" هي 10).
7- فارغ. 8- فارغ.
9- أنشأنا دالّة من نوع "boolean"، باسم "isEmpty"، وبما أنّ نوع الدالّة هو "boolean" فسوف تُرجِع الدالّة قيمة منطقيّة (True OR False)، ومهمّة الدالّة هي التحقق من كون المكدّس فارغ.
10- فتح قوس الدالّة.
11- أمر للدالّة بإرجاع ناتج المقارنة بين المتغيّر "top" والعدد صفر. إذا كان المتغيّر "top" أصغر من صفر، فسوف تُرجِع الدالّة القيمة "True" بمعنى أنّ الدالّة فارغة، أمّا إن كان المتغيّر "top" أكبر من أو يساوي صفر، فسترجع الدالّة "False" أي أن الدالة ليست فارغة.
ومن المهم أن نتذكّر أنّ عناوين المصفوفة تبدأ من العدد صفر، فإذا كان المتغيّر "top" يساوي صفر، فمعنى هذا وجود عنصر في المصفوفة، وبهذا لن تكون فارغة، وسوف ترجع الدالّة القيمة "False".
12- إغلاق قوس الدالّة.
13- أنشأنا دالّة باسم "Stack"، وهي عبارة عن دالّة بانية (constructor) تأخذ اسم "الكلاس" نفسه، والكلاس ينشئها تلقائيًّا حتى لو لم نكتبها، والدالّة البانية تعمل تلقائيًّا بمجرّد إنشاء كائن (object) للكلاس، لكنّنا نريد تخصيص الدالّة البانية بأمر معيّن، لذلك سنكتبها بأنفسنا.
وليس هذا مقام التفصيل في الدالة البانية على كل حال. لنواصل..
14- فتح قوس الدالّة.
15- حدّدنا قيمة مبدئيّةً للمتغيّر "top" لتكون "-1"، أي أنّ المكدّس سيكون فارغًا في البداية بشكل افتراضي، ولا يصح أن نجعل القيمة صفر للسبب المذكور أعلاه.
16- إغلاق قوس الدالّة.
17- أنشأنا دالّة جديدة من نوع "boolean"، باسم "push"، والدالّة تحتوي على معامل (parameter) واحد، وهذا المعامل هو عبارة عن كائن (object) من الكلاس "Scanner".
الهدف من الدالّة هو إدخال أو دفع (push) عناصر البيانات إلى المكدّس، ونحن نريد أن يحدد المستخدم تلك العناصر كما أسلفنا..
لذلك أنشأنا كائن باسم "sc" من الكلاس "scanner" كمعامل لهذه الدالّة.
18- فتح قوس الدالّة.
19- وضعنا شرطًا كما يلي: إذا كان المتغيّر "top" يساوي المتغيّر "maxsize" ناقصًا واحد.. لماذا قلنا "ناقصًا واحد"؟
لأنّ عناوين المصفوفة تبدأ من العدد صفر..
وإذا كانت أقصى مساحة حدّدناها للمصفوفة (maxsize) هي 10، فمعنى هذا أنّ أقصى عنوان (يمثله المتغير "top") يجب أن يكون 9، لأننا إذا بدأنا العد من الصفر إلى 9، ستكون لدينا 10 أرقام.
والشرط باختصار يقول: إذا وصل المتغير "top" إلى أقصى عدد مسموح به من عناصر البيانات "maxsize".
20- فتح قوس الشرط (إذا كان الشرط السابق صحيح، فسوف تنفيذ ما بين فتح قوس الشرط هذا وإغلاقه).
21- أمر بطباعة عبارة "overflow" على الشاشة، بمعنى أنّ عدد العناصر المسموح به وصل إلى أقصاه، ولا يمكن إضافة عنصر جديد.
22- أمر بإعادة القيمة "False".
23- إغلاق قوس الشرط.
24- نريد وضع أوامر بديلة في حال كان الشرط السابق خاطئًا، وذلك باستخدام كلمة "else"، التي تعني "وإلّا".
25- فتح قوس "else".
26- أمر بطباعة عبارة "Enter Value" كطلب للمستخدم بأن يدخل قيمة لتتم إضافتها إلى المكدّس.
27 - أنشأنا متغيّرًا من نوع "عدد صحيح"، باسم "val"، وقيمته هي ما سوف يدخله المستخدم، بحيث يجب أن يكون من نوع "عدد صحيح".
28 - أمر بزيادة قيمة المتغيّر "top" بمقدار "1"، والسبب هو دخول عنصر جديد إلى المكدّس، وكما أوضحنا سابقًا، يجب أن يشير المتغيّر "top" إلى أعلى عنصر موجود في المكدّس، لذلك ستتحول قيمة المتغير "top" من "-1" (فارغ) إلى "0" (يوجد عنصر واحد)..
ولو أضفنا عنصرًا جديدًا، فسوف تتغير قيمة المتغيّر "top" من "0" (يوجد عنصر واحد) إلى "1" (يوجد عنصران)، وهكذا حتى العدد 9 (لا تنسَ أنّ أقصى عدد عناصر مسموح به هو 10).
29- أمر بتعيين المتغير "val" كقيمة لأعلى عنوان في المصفوفة بعد زيادته بمقدار واحد بحسب الأمر الموجود في السطر 28.
بعبارة أخرى:
لو أنّ المستخدم أدخل القيمة "5" مثلًا، فسوف يتم تخزين هذه القيمة في المتغيّر "val"(السطر 27)، ومن ثم ستتم زيادة المتغيّر "top" بمقدار "1" (السطر 28)، وأخيرًا سنعيّن قيمة المتغيّر "top" كعنوان لعنصر البيانات الجديد "val"، وكأننا نقول: العنوان "0" خاص بالقيمة "5".
ولو أنّنا أردنا استعراض القيمة المخزّنة في العنوان "0" داخل المصفوفة "arr" كما يلي:
arr[0];
فسوف تكون النتيجة هي العدد "5".
30- أمر بطباعة عبارة "item pushed"، لإشعار المستخدم بإدخال العنصر إلى المكدِّس بنجاح.
31- أمر بإرجاع القيمة "True".
32- إغلاق قوس "else".
33- إغلاق قوس الدالّة (دالّة "push")
34- أنشأنا دالّة من نوع "boolean"، باسم "pop"، ومهمّتها كما أسلفنا هي حذف عنصر من المكدّس، وليس أيّ عنصر، بل أعلى عنصر فقط (العنصر الذي يشير إليه المتغيّر "top" بطبيعة الحال).
35- فتح قوس الدالّة.
36- وضعنا شرطًا مفاده: إذا كانت قيمة المتغيّر "top" تساوي "-1"، أي إذا كان المكدّس فارغًا.
37- فتح قوس الشرط.
38- طباعة عبارة "underflow"، لتنبيه المستخدم إلى عدم وجود عناصر في المكدّس لحذفها.
39- أمر بإرجاع القيمة "False".
40- إغلاق قوس الشرط.
41- سنضع شروطًا بديلة في حال عدم تحقق الشرط السابق، لذلك استخدمنا "else".
42- فتح قوس "else".
43- إنقاص قيمة المتغيّر "top" بمقدار "1"، لماذا؟ لأنّنا سنحذف أعلى عنصر كما ذكرنا، وبالتالي يجب أن تنزل قيمة المتغير "top" لتشير إلى العنصر الأعلى التالي.

جاري تحميل الاقتراحات...