العمليات على الحزمة :
حتى الان لدينا عملتين two operations وهم :
1- عملية ادخال العناصر الى الحزمة وسميناها push
2- عملية اخراج العناصر من الحزمة وسميناها pop
العملية push تقوم بادخال العنصر الى الحزمة ،، هذا العنصر سيقوم المستخدم بتمريره الى الدالة ()push
اي اذا اردنا ادخال العنصر 7 مثلا الى الحزمة، كل ما علينا هو استدعاء الدالة وتمرير العنصر 7 اليها كالاتي:
كود:
push(7);
العملية الاخرى وهي pop تقوم بسحب العناصر من الحزمة ،، ولتنفيذ هذه العملية يجب ان تستدعي الدالة
pop() ووضع متغير لكي يحمل قيمة العنصر الذي تم سحبه من الحزمة، بهذا الشكل:
كود:
int var=pop();
+++++++++++++++++++
خلينا هلا نتتبع برنامجنا السابق ،،لكي نعرف طريقة عمله ،، وراح اتحدث عن النسخة المكتوبة بلغة
راح ندخل بالدالة الرئسية :كود:
- int main()
2- {
3- Stack s;
4- // push numbers 2,4,8
5- s.push(2);
6- cout<<"\n2 is pushed\n";
7- s.push(4);
8- cout<<"\n4 is pushed\n";
9- s.push(
;
10- cout<<"\n8 is pushed\n";
11- // pop numbers
12- cout<<"\n"<<s.pop()<<" is poped"<<endl;
13- cout<<s.pop()<<" is poped"<<endl;
14- cout<<s.pop()<<" is poped"<<endl;
15- return 0;
16- }
===========================
في السطر 3 قمنا بعمل متغير من النوع Stack .
الان ما الذي سيحدث هنا !!
طبعا سيتم حجز مساحة للمتغير s وكذلك استدعاء الدالة Stack() بشكل تلقائي ، تعمل هذه الدالة على
تهيئة المتغير s ، اي اعطائه قيمة ابتدائية ، قبل ان نستخدمه . للمعلومية الدالة stack تسمى بال constructor.
واذا ذهبنا الى المتغير s في الذاكرة ، راح نشوف انه يتكون من :
"مصفوفه ثابتة حجمها 10 عناصر وهي array + عدد صحيح وهو top"
ما يهمنا الان هو القيمة الابتدائية ل top والتي سوف تكون -1 ،، انظر الى ال constructor جيدا .
+++++++++++++++
في السطر 5 قمنا باستدعاء الدالة push وتمرير العدد الصحيح 2 ، وذلك حتى ندفعه الى الحزمة.
كيف سيتم ذلك ؟؟
اولا سوف تقوم الدالة push بعمل اختبار ،، هل المصفوفة ذات ال 10 خانات ممتلئة ام لا ؟؟
اذا كانت الاجابة نعم ، راح تطلع لك رسالة تنبيه وينتهي البرنامج "طبعا هذا حل غير عملي ، ولكن هذا لغرض التوضيح والتركيز على المشكلة الاساسية "
واذا كانت الاجابة لا ،، اي ان هناك مساحة خالية لاستقبال عناصر ، فسوف يتم ادخال العدد 2 الى الحزمة
دون مشكلة.
الاسئلة التي تدور بذهنك حاليا هي:كيف نعرف ان المصفوفة ممتلئة او خالية ؟؟
كيف يتم ادخال العنصر 2 الى الحزمة ؟؟
الفكرة كلها تتمحور حول المتغير top ،، وسوف نطلق عليه الدليل او index .
كيف يتم ادخال العنصر 2 الى الحزمة؟؟
الاجابة:
كما ذكرنا سابقا ،، المكدس يحوي على "مصفوفة من 10 خانات ومتغير top "اطلقنا عليه اسم دليل ذو قيمة ابتدائية -1.
بالنسبة للمصفوفة فهي تستخدم لتخزين العناصر التي تقوم بتمريرها بواسطة الدالة push
اما الدليل فهو الذي يخبرنا ان المصفوفة خالية ام لا ؟ وايضا من خلاله نستطيع ادخال العناصر الى المصفوفة اي ان الدليل يعمل ك index للمصفوفة ، وسوف نرى كيف يتم ذلك.
نرجع الى اجابة السؤال ؟؟ كيف يتم ادخال العنصر 2 الى الحزمة ؟؟
شوف الدالة push
كود:
push(int i)
{
if(isFull())
{
cout<<"\nArray is Full";
exit(1);
}
else
{
++top;
array[top]=i;
}
}
اولا تقوم الدلة باجراء اختبار للتأكد من ان المصفوفة ممتلئة ام لا ، لانها لو امتلئت فلا نستطيع ادخال عناصر اخرى،ولنفرض ان المصفوفة خالية.
بعد ذلك سيتم زيادة المتغير top او الدليل بمقدار واحد "وحط مليون خط على كلمة زيادة"
اذا ستكون قيمة الدليل هي : -1 + 1 = 0
وبعدها سيتم ادخال العنصر "وفي مثالنا 2" داخل المصفوفة وبالتحديد داخل array[0]
+++++++++++++++++++++++
الاسطر 7 و 9 بنفس الاسلوب السابق ،
ستكون قمية المتغير توب الدليل بعد تنفيذ هذه الاسطر هي 2 ، وذلك لاننا ادخلنا عنصرين الى الحزمة.
اذا سوف تكون لدينا 3 عناصر داخل المصفوفة ، وقيمة الدليل الحالية هي 2.
++++++++++++++++++++++++
اعتقد اننا تجاهلنا هذا السؤال؟ كيف نعرف ان المصفوفة ممتلئة او خالية ؟؟
الاجابة:
تكون خالية اذا كانت قيمة الدليل هي -1 "اي لم ندخل اي عدد"
وتكون ممتلئة اذا كانت قيمة الدليل تساوي "قيمة اكبر عدد من العناصر يمكن ادخاله في المصفوفة ".
اي اذا كان الدليل يساوي 9 ،، وهو اكبر عدد من العناصر يمكن ادخاله في المصفوفة .
++++++++++++++++++++++
السطر 12و13و14 كلها تعمل بنفس النمط.
قمنا باستدعاء الدالة pop والتي لديها قيمة معادة ،وهي قيمة العنصرالذي سيتم سحبه من الحزمة.
كيف سيتم ذلك ؟؟ اي كيف سيتم سحب العناصر من الحزمة ؟؟.
كما ذكرت سابقا ،، الحزمة هو مصفوفة +دليل " :
كود:
while(there is no new lesson)
{
cout<<"الحزمة هو مصفوفة + دليل ";
}
المصفوفة تستخدم لحفظ العناصر او الاعداد التي يدخلها المستخدم (10 اعداد في مثالنا )
والدليل يعمل على اخبارنا بان هناك مساحة خالية ام لا ؟ هل المصفوفة ممتلئة ام لا ؟
وكذلك يعمل ك index في المصفوفة .
نشوف الدالة pop :
كود:
pop()
{
int number;
if(isEmpty())
{
cout<<"\nArray is Empty";
exit(1);
}
else
{
number=array[top];
top--;
}
return number;
}
اولا تختبر هل المصفوفة خالية ام لا ؟ لانها ان كانت خالية ، فماذا سنسحب !!
وستكون خالية اذا كانت قيمة المتغير top الدليل هي -1 ،، وما عدا هذه القيمة فهي ليست خالية.
الان نفرض ان المصفوفة تحوي العناصر التي ادخلناها سابقا باستخدام push ، وان top يساوي 2.
انظر الى هذا الامر جيدا:
كود:
number=array[top];
سيعمل top كدليل في المصفوفة ، اي ستكون هذا الجملة عند اول استدعاء للدالة بهذا الشكل:
كود:
number=array[2];
وبعدها سينقص top بمقدار واحد ، اي سيصبح 1.
وكهذا تم سحب العنصر من المصفوفة ووضعه في متغير اخر .
وبنفس الطريقة مع باقي الاستدعاءات.