0Pricing
Zig Academy · درس

مكدس عام من الصفر

بنية LIFO ذات معاملات نوعية فوق مخصّص ذاكرة

مكدس عام من الصفر درس مجاني في Zig Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Zig Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Zig Academy 4 دروس في المجموع.

وظيفة المكدس

المكدس مجموعة LIFO؛ أي إن آخر عنصر تدفعه هو أول عنصر تسحبه. تخيّله كأطباق مكدسة على سطح. 🍽️

جعله عامًا

لاحتواء أي نوع من العناصر، اكتب دالة تأخذ نوعًا وتُعيد نوع بنية. يمنحك كل استدعاء مكدسًا ملائمًا لذلك النوع.

fn Stack(comptime T: type) type {
    return struct {};
}

تخزين العناصر ومخصّص الذاكرة

تحتفظ البنية داخليًا بشريحة قابلة للنمو من العناصر، بالإضافة إلى مخصّص الذاكرة الذي تستعير منه الذاكرة. لا يخفي Zig عمليات التخصيص أبدًا.

return struct {
    items: []T,
    len: usize,
    alloc: std.mem.Allocator,
};

الإشارة إلى البنية باستخدام @This

البنية المُعادة مجهولة الاسم، لذلك تسمّي الأساليب نوعها بنفسها باستخدام @This(). ويُبقي ذلك كل أسلوب عامًا بالكامل.

const Self = @This();

تهيئة مكدس فارغ

تأخذ دالة init مخصّص الذاكرة وتُعيد مكدسًا فارغًا جديدًا. ولا يُخصّص شيء حتى تدفع عنصرًا.

fn init(a: std.mem.Allocator) Self {
    return .{ .items = &.{}, .len = 0, .alloc = a };
}

قد تفشل عملية Push

قد يتطلب توسيع المخزن ذاكرة، ولذلك تُعيد push اتحاد أخطاء. ويتعامل المستدعي صراحةً مع حالة نفاد الذاكرة.

fn push(self: *Self, value: T) !void {
    // grow then store
}

إعادة استخدام realloc للتوسيع

لتوفير مساحة، اطلب من مخصّص الذاكرة تنفيذ realloc للشريحة إلى حجم أكبر. ويعتمد الطول الجديد على سياسة التوسيع لديك.

self.items = try self.alloc.realloc(self.items, self.len + 1);
self.items[self.len] = value;
self.len += 1;

سحب القيمة العلوية

تُعيد pop قيمة اختيارية: العنصر العلوي إذا كان المكدس يحتوي على عنصر، أو null عندما يكون فارغًا. ولا تحدث أعطال عند فراغ المكدس.

fn pop(self: *Self) ?T {
    if (self.len == 0) return null;
    self.len -= 1;
    return self.items[self.len];
}

تحرير ما خصصته

بما أنك تملك المخزن، يجب أن تعيده. إذ تحرر دالة deinit الشريحة عبر مخصّص الذاكرة نفسه.

fn deinit(self: *Self) void {
    self.alloc.free(self.items);
}

استخدامه

أنشئ نوعًا ملموسًا باستدعاء الدالة، ثم هيّئه. إن Stack(i32) نوع حقيقي خضع للتحقق بالكامل، وجاهز لدفع أعداد صحيحة.

var s = Stack(i32).init(allocator);
defer s.deinit();
try s.push(42);

تعريف واحد، ومكدسات متعددة

استدعِ الدالة بأنواع مختلفة، فيكون كل نوع مكدسًا منفصلًا ومتخصصًا. تشترك Stack(u8) وStack(f64) في أي كود عن طريق الخطأ.

تحقق سريع

يحتاج مكدسك العام إلى ذاكرة الكومة للنمو. من أين تأتي هذه الذاكرة؟

مراجعة

المكدس العام دالة تُعيد نوعًا وتحتفظ بالعناصر إلى جانب مخصّص الذاكرة. توسّع push المكدس، وتُعيد pop قيمة اختيارية، وتحرر deinit الذاكرة. 🎯

الأسئلة الشائعة

هل درس «مكدس عام من الصفر» مجاني؟

نعم — نص درس «مكدس عام من الصفر» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Zig Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Zig Academy 4 دروس في المجموع.

ماذا ستتعلم في «مكدس عام من الصفر»؟

بنية LIFO ذات معاملات نوعية فوق مخصّص ذاكرة تتمرن على Zig Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Zig Academy؟

لا تُشترط خبرة سابقة. Zig Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «مكدس عام من الصفر»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Zig Academy هذا؟

نعم. كل درس في Zig Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مكدس عام من الصفر
  2. قائمة مترابطة أحادية الاتجاه
  3. استخدام HashMap وAutoHashMap
  4. المقارنة بين تحليل الأداء والأمان
← العودة إلى Zig Academy