جامعة حمص - كلية الهندسة المعلوماتية - السنة الثانية
ناديا خرسان
الخوارزميات وبنى المعطيات 1
بنية بيانات خطية (Linear Data Structure)
المكدس هو بنية معطيات خطية تشبه القائمة المترابطة ولكن لا يمكن الوصول إلا لآخر عنصر تم إدخاله.
يدعى مكان العنصر الأخير قمة المكدس (TOP).
لا يمكن إضافة العناصر وإزالتها إلا عند قمة المكدس فقط (Top)، حسب المبدأ:
«العنصر الداخل أخيراً هو الخارج أولاً» (LIFO = Last In, First Out)
المكدس يشبه تمامًا كومة من الأطباق في المطبخ:
هذا هو مبدأ LIFO (Last-In-First-Out) الذي يحكم عمل بنية البيانات المكدس.
يمكن استخدام المكدسات في العديد من التطبيقات التي تتطلب تخزين البيانات ثم استرجاعها بترتيب عكسي:
يتم استخدام المكدس للتأكد من أن الأقواس متوازنة في تعبير ما:
التعبير الصحيح: (a + b) * (c - d) → متوازن
التعبير الخطأ: (a + b) * (c - d)) → غير متوازن
يمكن تمثيل المكدس بطريقتين رئيسيتين:
كل طريقة لها مميزاتها وعيوبها، ويعتمد اختيار الطريقة على متطلبات التطبيق.
في هذا التمثيل نستخدم مصفوفة ذات حجم ثابت لتخزين عناصر المكدس.
حالة المكدس الفارغ: top = -1
في هذا التمثيل نستخدم عقد مترابطة لتخزين عناصر المكدس.
حالة المكدس الفارغ: top = NULL
تعتمد بنية البيانات المكدس على مجموعة من العمليات الأساسية التي تحكم طريقة عمله:
تهيئة المكدس بحيث يصبح فارغاً
للمصفوفة: top = -1
للقائمة: top = NULL
التعقيد الزمني: O(1)
إضافة عنصر جديد إلى قمة المكدس
يجب التحقق من عدم امتلاء المكدس لتجنب الطفحان (Overflow)
التعقيد الزمني: O(1)
حذف العنصر الموجود في قمة المكدس وإرجاع قيمته
يجب التحقق من عدم فراغ المكدس لتجنب الجفاف (Underflow)
التعقيد الزمني: O(1)
قراءة العنصر الموجود في قمة المكدس دون حذفه
يجب التحقق من عدم فراغ المكدس
التعقيد الزمني: O(1)
التحقق مما إذا كان المكدس فارغاً
للمصفوفة: return (top == -1)
للقائمة: return (top == NULL)
التعقيد الزمني: O(1)
التحقق مما إذا كان المكدس ممتلئاً
للمصفوفة: return (top == MAX_SIZE-1)
للقائمة: عادة لا يكون ممتلئاً إلا في حالة نفاد الذاكرة
التعقيد الزمني: O(1)
الحصول على عدد العناصر الموجودة في المكدس
للمصفوفة: return top + 1
للقائمة: عادة نحتفظ بعدد العناصر في متغير
التعقيد الزمني: O(1)
في هذا التنفيذ، نستخدم مصفوفة ذات حجم ثابت لتخزين عناصر المكدس.
نستخدم متغير top لتتبع موقع العنصر الأخير في المكدس:
top ثم نخزن العنصر الجديد في الموقع الجديدtop ثم نخفض قيمة toptop == -1top == MAX_SIZE - 1المكدس فارغ.
إضافة 5 عناصر جديدة إلى المكدس:
أدخل x = 10
أدخل x = 20
أدخل x = 30
أدخل x = 40
أدخل x = 50
القمة = 50
إزالة عنصر من المكدس:
القمة = 40
ملء المكدس حتى الحجم الأقصى:
القمة = 99
عدد العناصر في المكدس = 100
محاولة إضافة عنصر جديد:
أدخل x = 100
Overflow! Stack is full.
تفريغ المكدس.
المكدس فارغ.