Stacks

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 36

data structure

stacks

basheer al jarrah
‫ بشير الجراح‬:‫شرح الطالب‬
‫‪DATA STRUCTURE‬‬

‫اعزائي اول اشي عنا بمادة السكند هو الستاك‪ ،‬طيب شو هو الستاك؟‬


‫الستاك بنقدر نحكي عنه اشي زي سلة المالبس او مثال كتب فوق بعضها‪،‬‬
‫انت لما يكون عندك كتب فوق بعضها زي الصورة اذا بدك تحط كتاب بده‬
‫يكون اول كتاب من فوق واذا بدك تشيل كتاب بده يكون اول كتاب من‬
‫فوق برضه‪ ،‬وهاي هي بالزبط فكرة الستاك اعزائي اخر كتاب او عنصر‬
‫ضفته راح يكون اول كتاب او عنصر بتشيله عشان توصل للي بعده‬

‫وطبعا يا جماعة عشان هيك زي ما قلنا الستاك اخر عنصر بفوت هو اول‬
‫عنصر بطلع اسمها )‪LAST IN FIRST OUT(LIFO‬‬
‫طيب هسا فهمنا مبدأ الستاك بدنا نفهم كيف بنشتغل‬
‫عليهم وشو بنستفيد منهم تمام؟ اه تمام مش عكيفك عزيزي‬
‫‪DATA STRUCTURE‬‬

‫طيب متذكرين ال ‪??ARRAY LIST,LINKED LIST‬‬


‫اكيد متذكرهم عزيزي ما انت هبدت فيهم بالفيرست‪ ،‬طيب هذول راح‬
‫نستخدمهم عشان نعمل منهم ستاك النه الستاك هي ارراي بس بشروط‬
‫محددة اللي هي حكيناها فوق(اللي هي اخر عنصر بنضاف هو اول عنصر‬
‫بطلع ما انا عارفك راح تطلع تدور ومش راح تفهم عزيزي)‪ .‬طبعا راح‬
‫نشوف الستاك زي االرراي ليست العادية يعني حجمها محدد وبنقدرش‬
‫نزيده‪ ،‬راح تكون كالس عادية مع تيمبليت زي الصورة وفيها الفنكشنز‬
‫والعناصر تبعتها‬

‫طيب ماشي اول اشي عنا ‪ 3‬متغيرات أساسية بتكون ‪ PRIVATE‬وهي‬


‫ال‪ maxStackSize‬وهاذ اعزائي اللي هو بنحدد فيه حجم الستاك‬
‫وبكون اكبر سعة الها‬
‫وعندك كمان البوينتر *‪ list‬اللي راح يعمللنا ال ‪dynamic‬‬
‫‪ array‬وعندك متغير اسمه ‪ stackTop‬بأشرلنا على االندكس‬
‫اللي راح نضيف عليه(عارف انك مفهمتش تعيطش هسا لقدام بتفهم)‬
‫‪DATA STRUCTURE‬‬

‫طيب اعزائي خلينا نبلش بالعمليات الرئيسية على الستاك‬


‫اول اشي فنكشن االضافة اللي اسمه‬
‫‪ push‬‬

‫طيب خلينا نبلش بالكود سطر سطر‬


‫السطر رقم ‪ 1‬اللي هو التيمبليت اكيد فاهمينه بعديه عنا اسم الكالس مع‬
‫ال‪ 4‬نقاط عشان نقدر نوصل الفنكشن النه معرف جوا الكالس‬
‫طيب الفنكشن بوخذ باراميتر نوعها حسب نوع الكالس النه تيمبليت‪،‬‬
‫وسميناها ‪newItem‬‬
‫بالسطر رقم ثالث بستدعي الفنكشن ‪ isFullStack‬اللي برجع‬
‫‪ true‬اذا الستاك فل يعني بقدرش اضيف عليها ونركز انه حاط جوا ال‬
‫‪ if‬إشارة ! يعني اذا ‪ isFullStack‬بعطيني ‪ false‬يعني الستاك‬
‫مش فل راح يكون الشرط جوا ال‪ ، if true‬بفوت جوا جملة ال‪if‬‬
‫‪DATA STRUCTURE‬‬

‫بالسطر الرابع بجيب االرراي اللي اسمها ‪ list‬وال ‪stackTop‬‬


‫اللي هو حكينا اندكس اول مكان فاضي باالرراي واللي راح نضيف عليه‬
‫النه حكينا بنقدرش نضيف اال من فوق وبنحط فيه قيمة ال‪newItem‬‬
‫وبعدين بنزيد ال‪ stackTop‬عشان االندكس تبعه صار مليان فبدنا‬
‫إياه يأشر على اول مكان فاضي بنقدر نضيف فيه‪ ،‬وجملة ال‪else‬‬
‫عشان اذا كان الشرط بال ‪ if false‬يعني الستاك مليانة بطبع جملة‬
‫انه بقدرش يضيف على ستاك مليانة‪.‬‬

‫هسا نشوف فنكشن االزالة اللي راح نستخدمه عشان نعمل ‪remove‬‬
‫الخر عنصر تمت اضافته على الستاك‬
‫‪ pop‬‬

‫الفنكشن اسمه بوب بشوف اذا الستاك فاضية بحكيلك انه بتقدرش تحذف‬
‫من ستاك فاضية طبعا عن طريق فنكشن ‪ ، isEmptyStack‬فاذا‬
‫الستاك مش فاضية بنقص ‪ stackTop‬واحد فصار مكان اخر عنصر‬
‫‪DATA STRUCTURE‬‬

‫هو اللي راح نضيف عليه فهيك يعتبر اخر عنصر مش مهم بالنسبة النا‬
‫النه بنعتبر مكانه فاضي وبنضيف عليه عادي وهيك نعتبر حذفناه‪.‬‬

‫‪ top‬‬

‫طيب هسا فنكشن ال ‪ top‬بجيبلي اخر عنصر باالرراي اللي هو اخر‬


‫عنصر انضاف وأول عنصر راح ينحذف اذا استدعينا فنكشن ال‪pop‬‬
‫هون مستخدم فنكشن ‪ assert‬اللي بتعطيه جملة شرطية اذا كانت‬
‫‪ true‬بوقف البرنامج كامل زي ال‪ return 0‬اذا الشرط ‪false‬‬
‫بكمل طبيعي وال بصير اشي‬
‫هون معطيه ]‪ ، return list[stackTop -1‬طبعا قلنا انه‬
‫الستاك توب هو اول مكان فاضي فمكان اول عنصر راح يكون قبليه‬
‫بواحد‬
‫‪DATA STRUCTURE‬‬

‫‪ InitializeStack‬‬

‫هسا فنكشن ال ‪ initialize‬بنخلي ال‪ stackTop‬صفر هيك بنكون‬


‫تجاهلنا كل قيم االرراي (يعني حذفنا االرراي )‬
‫‪ isEmptyStack‬‬

‫الفنكشن برجع ‪ true‬اذا ال‪ stackTop =0‬يعني اذا الستاك‬


‫فاضية غير هيك برجع ‪false‬‬

‫‪ isFullStack‬‬
‫‪DATA STRUCTURE‬‬

‫الفنكشن برجع ‪ true‬اذا ال‬


‫‪ stackTop==maxStackSize‬يعني اذا الستاك فل‬

‫ال ‪ constructor‬بوخذ حجم الستاك باراميتر بشوف اذا انه اصغر‬


‫من او يساوي صفر يعني قيمة غير منطقية بخلي حجم الستاك اللي هو ال‬
‫‪ maxStackSize=100‬غير هيك بخلي الماكس سايز قيمة‬
‫الباراميتر‬
‫‪DATA STRUCTURE‬‬

‫وبخلي الستاك توب صفر عشان تكون الستاك فاضية وبعمل الليست او‬
‫االرراي او الستاك مسميات مختلفة والمعنى واحد‬
‫‪ destructor‬‬

‫بحذف الليست بكل بساطة مالك صافن‬


‫‪DATA STRUCTURE‬‬

‫الكوبي فنكشن بشتغل كالتالي‬


‫عندك ‪ stacks 2‬يعني ستاكين بدي انسخ الثانية واحط كل قيمها‬
‫باالولى‬
‫اول اشي بشطب الكالس األولى عشان افضيها‪ ،‬الكالس الثانية بتكون‬
‫‪ parameter by reference object‬اه اوبجكت مالك‬
‫مستغرب مهي الستاك أصال اوبجكت من الكالس اللي بتدرسه‬
‫المهم يعني الشكل حيكون هيك مثال لو بدي انسخ ‪ stack 2‬ل‬
‫‪stack 1‬‬
‫)‪ Stack1.copystack(stack2‬بجيب ال‪maxsize‬‬
‫تبع ‪ stack 2‬وبحط قيمته بالماكس تبع ‪ stack 1‬ونفس االشي‬
‫مع ال‪ stackTop‬وبعدين بما اني حذفت االرراي فوق اول اشي برد‬
‫اعمل االرراي بال‪ maxsize‬اللي نسخته من ‪ stack 2‬وبعدين‬
‫بعمل لوب بمشي من الصفر الصغر من ال‪ stackTop‬النه لو كان‬
‫مثال ال‪ stackTop=7‬يعني عندي ‪ 7‬عناصر واالندكس السابع اول‬
‫‪DATA STRUCTURE‬‬

‫مكان فاضي يعني عندي من ‪ 6-0‬فيهم عناصر بنسخهم والرب يبارك‬


‫الجميع‬
‫‪DATA STRUCTURE‬‬

‫ال ‪ copy constructor‬بخلي الليست ‪ null‬وبستدعي ال‬


‫‪copystack‬‬
‫وال‪ operator overloading‬بيجي بشوف اذا ال‪this‬‬
‫نفسها الستاك اللي بدي انسخ منها بنسخش اذا مش نفسها بستدعي‬
‫فنكشن الكوبي وراح يكون شكله هيك‬
‫‪Stack1=stack2‬‬
‫ال‪ this‬هو بوينتر باشر على االوبجكت اللي استدعى الفنكشن‬
‫بعدين الفنكشن برجع *‪ this‬يعني القيمة اللي بأشر عليها البوينتر‬
‫وهي ال‪ stack 1‬بالمثال عنا‬
‫‪DATA STRUCTURE‬‬

‫هاذ جدول ال‪ time complexity‬للستاك باستخدام االرراي‬


‫ليست‬
‫أي فنكشن استخدمنا فيه لوب بوخذ )‪ O(n‬وال‪ n‬اللي هي ال‬
‫‪ maxsize‬غير هيك الفنكشن بكون )‪O(1‬‬
‫‪DATA STRUCTURE‬‬

‫طيب هسا لو اعطيتك ستاك وحكيتلك اطبعلي عناصرها بدون ما يكون‬


‫عندك ‪ access‬للكالس يعني من االخر الكود بده يكون بال‪main‬‬

‫طيب هون عنا كالس عملتلها ‪ push‬للقيم ‪ 8 4 10 9‬بعدين عملت‬


‫‪ pop‬يعني شلت الثمانية منها بعدين عملت ‪ push‬لل‪stackTop‬‬
‫‪ + 2‬يعني ‪ 2+4‬اللي هي ‪ 6‬بعدين عملت بوش لل‪ 3‬فصارت الستاك‬
‫عندي هيك‬
‫‪3‬‬
‫‪6‬‬
‫‪4‬‬
‫‪10‬‬
‫‪9‬‬
‫طيب حلو هسا كيف بدي اطبعها من بدايتها يعني ابلش من التسعة؟؟‬
‫راح اعمل ستاك ثانية اسميها ‪ tempObj‬واحط فيها قيم الستاك‬
‫األولى‪ ،‬بس ما راح تزبط معي اال بالعكس النه راح ابلش من فوق يعني‬
‫‪DATA STRUCTURE‬‬

‫راح اجيب ال‪ 3‬احطها بالستاك ‪ temp‬بعدين اشيلها من الستاك‬


‫االصلية عشان اقدر أوصل لل‪6‬‬
‫طيب هسا شو هي ال‪3‬؟؟ هي ال‪ stackTop‬فعليا اللي بوصلها عن‬
‫طريق فنكشن ال‪ )(top‬فبعمل‬
‫))(‪ tempObj.push(obj.top‬بعدين بعمل ‪obj.pop‬‬
‫عشان نطلع عالقيمة اللي بعدها‬
‫طيب متى راح نوقف؟؟ لما تفضى الستاك عشان هيك بدنا نحط لوب انه‬
‫يوقف لما تفضى الستاك‬

‫طيب هي الكود اللي شرحناه هيك راح يصير ال‪ TempObj‬فيه قيم‬
‫الستاك األصلي بس بالعكس يعني‬
‫‪9‬‬
‫‪10‬‬
‫‪4‬‬
‫‪6‬‬
‫‪3‬‬
‫طيب هسا بدي ارجع القيم للستاك االصلية زي ما هي كيف؟‬
‫‪DATA STRUCTURE‬‬

‫نفس الحركة اللي عملناها فوق بنعمللها ‪ push‬لل‪ top‬تبع ال‬


‫‪ tempobj‬فبتتخزن فيها قيم ال‪ tempobj‬معكوسة اللي هي‬
‫أصال قيم الستاك االصلية‬
‫بس هون بكل بساطة قبل ما اعمل ‪ pop‬للتوب بال‪ temp‬بطبعه‬
‫وخلصنا‬
‫وهي الكود‬
‫‪DATA STRUCTURE‬‬

‫طيب هيك خلصنا الستاك باستخدام االرراي ليست هسا بدنا نشوفها‬
‫باستخدام اللينكد ليست بنفس العمليات‬
‫‪.…push,top,isEmpty,isFull‬‬
‫اول اشي بدنا نعمل ‪ struct‬عشان نعمل ال‪ NODES‬وكودها بسيط‬
‫ستركت فيها بوينتر عشان يوخذ لينك النود التالية وفيها متغير بحفظ ال‬
‫‪info‬‬

‫طيب لما نعمل الكالس راح يكون عنا بوينتر اسمه ‪ stackTop‬بأشر‬
‫على اخر عنصر انضاف على الستاك‬
‫يعني لو قلنا الستاك حطينا فيها ‪ 2 1‬راح يأشر على ال‪(2‬يعني البوينتر‬
‫فيه لوكيشن النود اللي ال‪ info‬فيه تساوي ‪)2‬ولو ضفنا ‪ 3‬راح يصير‬
‫الستاك توب يأشر على ‪ 3‬وهكذا عزيزي‬
‫طيب خلينا نبلش بالعمليات‬
‫)‪ constructor(default‬‬
‫‪DATA STRUCTURE‬‬

‫هون راح اخلي ال‪ stackTop = NULL‬يعني ما بأشر على أي‬


‫نود الليست فاضية‬
‫‪ isEmptyStack‬‬

‫اذا الستاك توب ما بأشر على اشي يعني الستاك فاضية وراح يرجع‬
‫‪true‬‬
‫‪ isFullStack‬‬

‫طبعا الفنكشن راح يرجع دايما ‪ false‬وهي فكرة اللينكد ليست أصال انه‬
‫ما يكون عندي مكان محجوز عالفاضي وال حجم محدود‬
‫‪DATA STRUCTURE‬‬

‫‪ initiazieStack‬‬

‫هون راح اعمل بوينتر جديد اسميه ‪ temp‬اخليه يأشر على اول نود‬
‫بالستاك اللي هو بأشر عليه ال‪ stackTop‬بسطر رقم ‪ 3‬أصال بعدين‬
‫‪DATA STRUCTURE‬‬

‫بخلي الستاك توب يأشر على ثاني نود بسطر رقم ‪4‬‬

‫بعدين بعمل ‪ delete temp‬فبحذف النود األولى وطبعا هاذ الحكي‬


‫كله داخل لوب طول ما الستاك مش فاضية‬
‫‪DATA STRUCTURE‬‬

‫الفنكشن بسيط بشيك اذا الستاك فاضية بوقف البرنامج اذا مش فاضية‬
‫بطبعلي اخر ايليمنت بالستاك‬
‫‪DATA STRUCTURE‬‬

‫نفس فنكشن ال ‪ initialize‬بس انه بتنفذ مرة وحدة بدون لوب‬


‫هسا اجينا على ال‪copyStack‬‬
‫عشان الفنكشن طويل راح نقسمه الجزاء‬
‫‪DATA STRUCTURE‬‬

‫بالسطر رقم ‪ 1‬بعمل ‪ 3‬بوينترات راح استخدمهم بالنسخ‬


‫بالسطر ‪ 2‬بشوف اذا الستاك اللي بدي انسخ عليها مش فاضية بفضيها‬
‫بالفنكشن ‪ initializeStack‬وبالسطر رقم ‪ 3‬بشوف اذا الستاك‬
‫اللي بدي انسخها فاضية بكون فيش اشي انسخه بخلي الستاك توب =‬
‫‪ null‬وخلص‬
‫اما اذا مش فاضية بجيب بوينتر من البوينترات اللي عملتهم بالسطر رقم‬
‫‪ 1‬اسمه ‪ current‬وبخليه يساوي الستاك توب للفنكشن اللي بدي‬
‫انسخ منها\\‪4‬‬
‫بعدين بما انه عندي الستاك اللي بدي انسخ عليها فاضية بخلي الستاك‬
‫توب يعمللي نود جديد‬
‫‪DATA STRUCTURE‬‬

‫طيب انا عملت النود األولى باجي بحط فيها قيمة النود األولى بالستاك‬
‫اللي بدي انسخ منها\\‪6‬‬
‫وبحط اللينك فيها ‪null \\7‬‬
‫بعدين بجيب البوينتر اللي انا عامله اللي اسمه ‪ last‬بخليه يأشر على‬
‫النود اللي عملتها\\‪8‬‬
‫وبخلي ال‪(current‬اللي هو بساوي الستاك توب للستاك اللي بدي‬
‫انسخ منها يعني باشر على اول نود فيها)‬
‫يروح على النود اللي بعدها\\‪9‬‬
‫بعدين بعمل لوب طول مهو ال‪ current != null‬يعني لحد ما‬
‫يوصل الخر نود بالستاك اللي بدي انسخ منها النه بمشي عليها‬
‫‪DATA STRUCTURE‬‬

‫جوا اللوب بعمل نود من البوينتر اللي عملته بسطر ‪10\\ 1‬‬
‫وبحط فيه ‪ info‬النود اللي بأشر عليه ال‪ current‬اللي هو بالستاك‬
‫اللي بدي انسخها\\‪11‬‬
‫بعدين بخلي النود اللي عملته ما يأشر على اشي\\‪12‬‬
‫بعدين بنجيب ال‪ last‬اللي خليناه يأشر على النود اللي عملناها من ال‬
‫‪(stackTop‬شوف سطر‪)8‬وبنخلي‬
‫‪last->link=newNode‬‬
‫يعني ال‪ last->link‬اللي هو اللينك المخزن بالنود اللي عملناه من ال‬
‫‪ stackTop‬يعني بنخلي نود ال‪ stackTop‬يأشر على ال‬
‫‪newNode‬‬
‫بعدين بخلي ال‪ last‬يأشر على ال‪( newNode‬ال‪ last‬راح يأشر‬
‫على اخر نود ضفته اللي )‬
‫‪DATA STRUCTURE‬‬

‫يعني هي رسمة للتوضيح‬


DATA STRUCTURE

‫طبعا عارفينهم ما في داعي نشرحهم مرة ثانية‬


Copy constructor
Operator overloading,destructor
DATA STRUCTURE

‫ والستاك‬unorderd linked list‫طيب طبعا في تشلبه بين ال‬


‫النها مشتقة منها أصال فالفنكشنز اغلبها موجود في اللينكد ليست بس‬
stack class derived‫ فبنقدر نحكي انه ال‬،‫بأسماء مختلفة‬
from linked list
Linked list Stack list
insertFirst push
initializeList initializeStack
isEmptyList isEmptyStack
‫ طبعا أي فنكشن استخدمنا فيه لوب بوخذ‬،big O‫وهي جدول ال‬
nodes‫ هون بتكون عدد ال‬n‫ وال‬o(n)
DATA STRUCTURE

postfix expression‫طيب اعزائي تبقى موضوع ال‬


‫ يفضل تدرسوه على شرح الدكتورة رشا عبيدات‬calculator
‫بالفيديو التالي الدقيقة‬
41:30
Stacks (part 2) - YouTube )17(
‫ يفضل ترجعله بعد شرح دكتورك واي اشي‬،‫ الشرح غير كافي‬:‫مالحظات‬
‫بنزللك إياه‬
‫هسا خلونا نشوف شوية أسئلة رايقة‬
1. Process of inserting an element in
stack is called ____________
a) Create
b) Push
c) Evaluation
d) Pop
2. Process of removing an element from
stack is called __________
a) Create
b) Push
c) Evaluation
d) Pop
DATA STRUCTURE

3. Pushing an element into stack already


having five elements and stack size of 5,
then stack becomes ___________
a) Overflow
b) Crash
c) Underflow
d) User flow
4. Which data structure is needed to
convert infix notation to postfix
notation?
a) Branch
b) Tree
c) Queue
d) Stack
DATA STRUCTURE

5. The prefix form of an infix expression


(p + q) – (r * t) is?
a) + pq – *rt
b) – +pqr * t
c) – +pq * rt
d) – + * pqrt
6. Which data structure is used for
implementing recursion?
a) Queue
b) Stack
c) Array
d) List
7. Which of the following statement(s)
about stack data structure is/are NOT
correct?
a) Linked List are used for implementing
Stacks
b) Top of the Stack always contain the
new node
c) Stack is the FIFO data structure
DATA STRUCTURE

d) Null link is present in the last node at


the bottom of the stack
8. Consider the following operation
performed on a stack of size 5.

Push(1);
Pop();
Push(2);
Push(3);
Pop();
Push(4);
Pop();
Pop();
;Push(5)
DATA STRUCTURE

After the completion of all operation, the


number of elements present in stack is?
a) 1
b) 2
c) 3
d) 4
9. The type of expression in which
operator succeeds its operands is?
a) Infix Expression
b) Prefix Expression
c) Postfix Expression
d) Both Prefix and Postfix Expressions
10. If the elements “A”, “B”, “C” and
“D” are placed in a stack and are
deleted one at a time, what is the order
of removal?
a) ABCD
b) DCBA
c) DCAB
d) ABDC
DATA STRUCTURE

11. Which of the following real world


scenarios would you associate with a
stack data structure?
a) piling up of chairs one above the
other
b) people standing in a line to be
serviced at a counter
c) offer services based on the priority of
the customer
d) tatkal Ticket Booking in IRCTC
DATA STRUCTURE

12. What is the best case time


complexity of deleting a node in a Singly
Linked list?
a) O (n)
b) O (n2)
c) O (nlogn)
d) O (1)
13. Consider these functions:
push() : push an element into the stack
pop() : pop the top-of-the-stack element
top() : returns the item stored in top-of-
the-stack-node
What will be the output after performing
these sequence of operations

push(20);
push(4);
top();
pop();
pop();
DATA STRUCTURE

push(5);
top();
a) 20
b) 4
c) stack underflow
d) 5
1 b 9 c
2 d 10 b
3 a 11 a
4 d 12 d
5 c 13 d
6 b
7 c
8 a

You might also like