The Stack ADT

الفصل الرابع: المكدس (LIFO)

الهدف: فهم مبدأ "آخر داخل، أول خارج" وتطبيقاته في موازنة الرموز وتقييم التعابير.
1

LIFO (Last In, First Out)

كيف يعمل المكدس؟

تخيل كومة من الصحون. يمكنك فقط إضافة صحن جديد في الأعلى (Top)، ويمكنك فقط سحب الصحن الموجود في الأعلى.

العمليات الأساسية ($O(1)$):
  • push(x): إضافة عنصر للقمة.
  • pop(): إزالة العنصر من القمة.
  • peek() / top(): رؤية القمة دون إزالة.
Data 3
Data 2
Data 1

Top of Stack ↑

2

Implementation Strategies

Array Implementation

نستخدم مصفوفة ومتغير topOfStack يشير لآخر عنصر.

// Push
array[++top] = x;

// Pop
return array[top--];

مشكلة: الحجم ثابت (قد يمتلئ Stack Overflow).

Linked List Implementation

الإضافة والحذف تتم دائماً من رأس القائمة (Head).

// Push (Insert First)
newNode.next = head;
head = newNode;

// Pop (Delete First)
head = head.next;

ميزة: حجم ديناميكي (لا يمتلئ إلا بامتلاء الذاكرة).

3

Applications of Stack

1. Balancing Symbols (موازنة الأقواس)

للتأكد من صحة الكود: ( ( ) [ ] ).
عند فتح قوس (، نعمـل Push.
عند إغلاق قوس )، نعمل Pop ونتأكد من التطابق.
في النهاية يجب أن يكون المكدس فارغاً.

2. Postfix Expression Evaluation

لحساب: 6 5 2 3 + 8 * + 3 + *
الأرقام: Push. العمليات (+، *): Pop رقمين، احسب، ثم Push النتيجة.
هذا أسهل للكمبيوتر من التدوين العادي (Infix) لأنه لا يحتاج أقواس أو أولويات.

3. Method Calls (استدعاء الدوال)

عند استدعاء دالة، يتم تخزين متغيراتها المحلية وعنوان العودة في المكدس.
عند الانتهاء (return)، يتم إزالتها (Pop) للعودة للدالة السابقة.
هذا يفسر خطأ StackOverflowError عند التكرار اللانهائي (Recursion).

🛡️ EXAM VAULT (خزنة الاختبار)
EXCEPTION / خطأ

Pop on Empty Stack

ماذا يحدث إذا استدعينا pop() والمكدس فارغ؟
يحدث خطأ Underflow (أو يرمي Exception).
يجب دائماً التحقق بـ isEmpty() قبل الحذف.

TRACING / تتبع

Postfix Tracing

Exp: 1 2 + 3 *
1. Push 1, Push 2 [Stack: 1, 2]
2. Op +: Pop 2, Pop 1 -> 1+2=3 -> Push 3 [Stack: 3]
3. Push 3 [Stack: 3, 3]
4. Op *: Pop 3, Pop 3 -> 3*3=9 -> Push 9
Result: 9

→ السابق (Ch 3) الفصل التالي (Ch 5) ←