طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 101 · تركيب البيانات والخوارزميات
الدرس 2 · الوحدة 1: مقدمة في تراكيب البيانات والخوارزميات

جولة في أشهر تراكيب البيانات

سبعة تراكيب ستتعمق فيها خلال المقرر، وأين تقابل كلًّا منها في حياتك. ⏱ نحو 25 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تميّز التراكيب الخطية وغير الخطية وجداول التجزئة.
  • تشرح فكرة المصفوفة والقائمة المترابطة والمكدس والطابور والشجرة والرسم.
  • تمثّل المكدس بـ list والطابور بـ deque.
  • تربط كل تركيب بتطبيق حقيقي.

١التراكيب نوعان

النوعالفكرةأمثلة
خطّية Linearالعناصر في صف واحد: لكل عنصر سابق ولاحق.المصفوفة، القائمة المترابطة، المكدس، الطابور
غير خطّية Non-linearالعنصر قد يرتبط بأكثر من عنصر.الشجرة، الرسم البياني
جداول التجزئة Hash Tableمفتاح يتحول إلى رقم خانة مباشرة.dict و set في بايثون

٢المصفوفة والقائمة المترابطة

1273051801234
المصفوفة: خانات متجاورة مرقمة من 0؛ الوصول لأي خانة برقمها مباشرة.

المصفوفة Array: خانات متجاورة في الذاكرة. ميزتها: الوصول إلى الخانة رقم 3 فوري. وعيبها: الإدراج في أولها يتطلب إزاحة كل العناصر. والقائمة list في بايثون مصفوفة ديناميكية تكبر وحدها.

127305∅
القائمة المترابطة: كل عقدة فيها قيمة ومؤشر إلى العقدة التالية.

القائمة المترابطة Linked List: كل عنصر «عقدة» تعرف العقدة التالية فقط. ميزتها: الإدراج في أولها سريع جدًّا. وعيبها: للوصول إلى العنصر الخامس تمر على الأربعة قبله. ستبنيها بنفسك في الدرس 13.

٣المكدس والطابور

صفحة 1صفحة 2صفحة 3المكدس: آخر من يدخل أول من يخرجأحمدسارةخالدمنىالطابور: أول من يدخل أول من يخرجيخرجيدخل
المكدس (مثل زر الرجوع في المتصفح) والطابور (مثل طابور المحاسبة).
main.py
# المكدس: صفحات زرتها في المتصفحhistory = []history.append("الرئيسية")history.append("الأخبار")history.append("الرياضة")print("رجوع من:", history.pop())print("الصفحة الحالية:", history[-1])
Shell×
>>> %Run main.py
رجوع من: الرياضة
الصفحة الحالية: الأخبار
>>>
main.py
from collections import deque# الطابور: عملاء ينتظرون عند المحاسبline = deque()line.append("أحمد")line.append("سارة")line.append("خالد")print("دور:", line.popleft())print("الباقون:", list(line))
Shell×
>>> %Run main.py
دور: أحمد
الباقون: ['سارة', 'خالد']
>>>

المكدس Stack: آخر ما دخل يخرج أولًا (LIFO)، مثل كومة الأطباق. والطابور Queue: أول ما دخل يخرج أولًا (FIFO)، مثل طابور الانتظار.

٤جدول التجزئة: القاموس

القاموس يحوّل المفتاح إلى رقم خانة بدالة اسمها دالة التجزئة hash، فيقفز إليها مباشرة دون بحث:

main.py
students = {441001: "أحمد", 441002: "محمد", 441003: "يوسف"}print(students[441002])print(441009 in students)
Shell×
>>> %Run main.py
محمد
False
>>>

٥الشجرة والرسم البياني

الكليةالبرمجةالشبكاتمقرر 111مقرر 101مقرر 211
الشجرة: جذر في الأعلى، ولكل عقدة أبناء، ولا حلقات.
main.py
# شجرة بسيطة بقاموس: كل عقدة ← قائمة أبنائهاtree = {    "الكلية": ["البرمجة", "الشبكات"],    "البرمجة": ["مقرر 111", "مقرر 101"],    "الشبكات": ["مقرر 211"],}print(tree["البرمجة"])
Shell×
>>> %Run main.py
['مقرر 111', 'مقرر 101']
>>>
23015033026080330المدينةينبعبدرجدةمكة
الرسم البياني: عقد (مدن) وأضلاع (طرق) بينها، وقد يكون لكل ضلع وزن (المسافة بالكيلومتر تقريبًا).
main.py
# رسم بياني بقائمة الجوار: كل مدينة ← المدن المتصلة بهاroads = {    "المدينة": ["ينبع", "بدر"],    "ينبع": ["المدينة", "جدة"],    "بدر": ["المدينة", "جدة", "مكة"],    "جدة": ["ينبع", "بدر", "مكة"],    "مكة": ["بدر", "جدة"],}print("طرق من بدر:", roads["بدر"])
Shell×
>>> %Run main.py
طرق من بدر: ['المدينة', 'جدة', 'مكة']
>>>

٦أين نرى كل تركيب؟

التركيبتطبيق حقيقي
المصفوفةدرجات الطلاب، وبكسلات الصورة
القائمة المترابطةقائمة تشغيل الأغاني: التالي والسابق
المكدسزر التراجع Ctrl+Z، وزر الرجوع في المتصفح
الطابورطابور الطباعة، وطلبات خادم الموقع
جدول التجزئةالبحث برقم الهوية، وتسجيل الدخول
الشجرةمجلدات الحاسب، وصفحات HTML (شجرة DOM)
الرسم البيانيخرائط الطرق، وشبكات الأصدقاء

توقّع وتحقّق

زر Ctrl+Z (تراجع) يعتمد على:

آخر تعديل يُلغى أولًا.

طابور الطباعة يعتمد على:

أول ملف أُرسل يُطبع أولًا.

خريطة الطرق بين المدن تُمثَّل بـ:

عقد وأضلاع.

الوصول إلى الخانة رقم 500 فوري في:

خانات متجاورة.

الخلاصة

تحدٍّ برمجي: زر الرجوع في المتصفح

سهل

المستخدم زار الصفحات بالترتيب: الرئيسية، المنتجات، القهوة، السلة، ثم ضغط زر الرجوع مرتين. استخدم مكدسًا لتعرف الصفحة الحالية.

المطلوب:
  • أضف الصفحات الأربع إلى قائمة بـ append.
  • نفّذ الرجوع مرتين بـ pop، واطبع كل صفحة تُغلق: أُغلقت: السلة
  • في الأخير اطبع: الصفحة الحالية: المنتجات

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
history = []
المطلوب×
أُغلقت: السلة
أُغلقت: القهوة
الصفحة الحالية: المنتجات
💡 تلميح 1
history[-1] آخر عنصر في القائمة، أي قمة المكدس.
💡 تلميح 2
pop() تحذف آخر عنصر وتُرجعه.

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
history = []for page in ["الرئيسية", "المنتجات", "القهوة", "السلة"]:    history.append(page) for _ in range(2):    print("أُغلقت:", history.pop()) print("الصفحة الحالية:", history[-1])
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس