ملاحظة: هذا المقال بقلم أحمد بوشفرة. الآراء الواردة تعبر عن الكاتب.
أحمد بوشفرة: مبرمج ومؤلف تقني، أساعد المطورين على بناء تطبيقات ويب حديثة وسريعة.
يمكنك أيضاً نشر مقالك هنا والترويج لخدماتك أمام جمهور من المبرمجين. تواصل معنا
لخص هذا المقال باستخدام ChatGPT
انسخ الأمر أدناه والصقه في ChatGPT للحصول على ملخص سريع للمقال:
لخص لي هذا المقال في نقاط رئيسية: https://www.ahmedbouchefra.com/what-is-stack-data-structure/
تم النسخ!
تخيل أن لديك مجموعة من الصحون وأنت تقوم بترتيبها.
تضع صحنًا أزرق، ثم أخضر، ثم أصفر، وأخيرًا برتقالي وأحمر.
عندما تريد أخذ صحن، أي واحد ستختار؟
هل ستسحب الصحن الأزرق من الأسفل وتخاطر بكسر كل الصحون؟
أم ستسحب الصحن الأصفر من المنتصف؟
بالتأكيد لا.
الطريقة المنطقية هي أن تسحب الصحن الأحمر من الأعلى.
بعدها، إذا احتجت صحنًا آخر، ستسحب الصحن البرتقالي.
ما فعلته للتو هو تطبيق المبدأ الأساسي لبنية البيانات التي نسميها الستاك (Stack).
مبدأ “آخر من يدخل، أول من يخرج” (LIFO)
آخر صحن وضعته (الأحمر) هو أول صحن قمت بسحبه.
هذا المبدأ يُعرف في عالم البرمجة باسم “آخر من يدخل، أول من يخرج” أو LIFO (Last-In, First-Out).
الستاك هو ببساطة هيكل بيانات يتبع هذا المبدأ البسيط والفعال.
[!TIP] لتتذكر الستاك دائمًا، فكر في كومة الصحون. آخر عنصر تضيفه هو أول عنصر تسحبه.
graph TD
subgraph "إضافة عناصر (Push/Append)"
A[البداية] --> B(إضافة صحن 1);
B --> C(إضافة صحن 2);
C --> D(إضافة صحن 3);
end
subgraph "الكومة (Stack)"
S3[صحن 3 (أعلى)]
S2[صحن 2]
S1[صحن 1 (أسفل)]
S3 --> S2 --> S1;
end
subgraph "إزالة عناصر (Pop)"
P1(سحب صحن 3) --> P2(سحب صحن 2);
P2 --> P3(سحب صحن 1);
end
D --> S3;
S3 --> P1;
الستاك مقابل الكيو (Queue)
هناك بنية بيانات أخرى تعمل عكس الستاك تمامًا، وهي الكيو (Queue).
لتوضيح الفرق، تخيل طابورًا في مخبز.
أول شخص يصل إلى الطابور هو أول شخص يحصل على الخبز ويغادر.
وآخر شخص يصل هو آخر من يغادر.
هذا المبدأ يُعرف باسم “أول من يدخل، أول من يخرج” أو FIFO (First-In, First-Out).
باختصار:
- الستاك (Stack): كومة صحون (LIFO).
- الكيو (Queue): طابور المخبز (FIFO).
أين نستخدم الستاك؟
الستاك ليس مجرد مفهوم نظري، بل له استخدامات عملية ومهمة في البرمجة، وترجمته الحرفية هي “الكومة”.
هو طريقة رائعة لتنظيم البيانات.
- عمليات التراجع (Undo): مثل الضغط على
Ctrl+Zفي برامج التحرير. كل إجراء هو عنصر يُضاف للستاك، والتراجع هو سحب آخر إجراء. - التحقق من الأقواس: في الأكواد البرمجية، يُستخدم الستاك للتأكد من أن كل قوس مفتوح
(يقابله قوس مغلق). - سجل التصفح (Browser History): الصفحات التي تزورها تُخزن في ستاك. عندما تضغط على زر “الرجوع”، فأنت تعود إلى آخر صفحة دخلتها (آخر عنصر أُضيف).
مثال عملي: الستاك في بايثون
لنرى كيف يمكننا محاكاة الستاك باستخدام قائمة (List) بسيطة في بايثون.
الستاك ليس أمرًا أو دالة مدمجة باسم stack، بل هو طريقة لتنظيم البيانات.
سنستخدم قائمة فارغة ونطبق عليها مبدأ LIFO.
# لنقم بإنشاء قائمة فارغة لتمثل الستاك
# يمكن أن نسميها أي شيء، لكن "stack" يوضح الفكرة
stack = []
# الآن، لنضف بعض العناصر (الصحون) إلى الستاك
# نستخدم دالة .append() لإضافة عنصر إلى نهاية القائمة
print("إضافة العناصر...")
stack.append(1) # الصحن الأول
stack.append(2) # الصحن الثاني
stack.append(3) # الصحن الثالث (في الأعلى الآن)
print(f"الستاك بعد إضافة العناصر: {stack}")
# الآن، لنسحب عنصرًا من الستاك
# نستخدم دالة .pop() بدون تحديد فهرس
# ستقوم بسحب آخر عنصر تمت إضافته
print("\nسحب العناصر...")
first_out = stack.pop()
print(f"أول عنصر تم سحبه: {first_out}") # يجب أن يكون 3
print(f"الستاك الآن: {stack}")
# لنسحب مرة أخرى
second_out = stack.pop()
print(f"ثاني عنصر تم سحبه: {second_out}") # يجب أن يكون 2
print(f"الستاك في النهاية: {stack}")
شرح الكود خطوة بخطوة
stack = []
هنا ننشئ قائمة فارغة. هذه القائمة ستكون بمثابة الستاك الخاص بنا.
stack.append(1)
نستخدم الدالة **append** (إلحاق) لإضافة العنصر 1 إلى القائمة.
stack.append(2)
ثم نضيف العنصر 2.
stack.append(3)
وأخيرًا نضيف العنصر 3.
الآن، القائمة تحتوي على [1, 2, 3]. العنصر 3 هو آخر عنصر دخل، وهو في “أعلى” الستاك.
stack.pop()
هنا يأتي دور السحر.
الدالة **pop** عندما تُستخدم بدون تحديد رقم (فهرس)، تقوم بإزالة وإرجاع آخر عنصر في القائمة.
لذلك، في المرة الأولى، ستسحب الرقم 3.
بعد السحب، تصبح القائمة [1, 2].
عندما نستدعي pop مرة أخرى، ستسحب الرقم 2.
[!WARNING] لو استخدمنا
pop(0)، لكان سيسحب أول عنصر (الرقم 1)، وهذا يتبع مبدأ الكيو (FIFO)، وليس الستاك. عدم تحديد الفهرس هو مفتاح عمل الستاك باستخدام القوائم.
خلاصة
ببساطة، الستاك هو هيكل بيانات يعتمد على مبدأ LIFO.
تذكر دائمًا مثال كومة الصحون.
آخر ما تضعه هو أول ما تأخذه.
هذا المفهوم البسيط قوي للغاية وستجده في العديد من جوانب البرمجة وتطوير البرمجيات.
هل لديك سؤال أو استفسار؟ اترك تعليقاً بالأسفل: