0Pricing
Zig Academy · บทเรียน

สแตกแบบทั่วไปตั้งแต่เริ่มต้น

สแตกแบบ LIFO ที่กำหนดชนิดข้อมูลได้บนตัวจัดสรรหน่วยความจำ

สแตกแบบทั่วไปตั้งแต่เริ่มต้น เป็นบทเรียน Zig Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Zig Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน

สแตกทำงานอย่างไร

สแตกคือคอลเลกชันแบบ LIFO: รายการสุดท้ายที่คุณ push จะเป็นรายการแรกที่คุณ pop ลองนึกถึงจานที่วางซ้อนกันบนเคาน์เตอร์ 🍽️

ทำให้เป็นแบบทั่วไป

หากต้องการรองรับชนิดสมาชิกใดก็ได้ ให้เขียนฟังก์ชันที่รับชนิดข้อมูลและ ส่งคืนชนิดโครงสร้าง แต่ละการเรียกใช้จะได้สแตกที่ปรับให้เหมาะกับชนิดนั้น

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 รับตัวจัดสรรและส่งคืนสแตกว่างชุดใหม่ จะยังไม่มีการจัดสรรหน่วยความจำจนกว่าจะเรียกใช้ push

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) เป็นชนิดข้อมูลจริงที่ตรวจสอบครบถ้วนและพร้อมสำหรับการ push จำนวนเต็ม

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

นิยามเดียว สแตกหลายชุด

เรียกใช้ฟังก์ชันด้วยชนิดข้อมูลต่างกัน แล้วแต่ละชนิดจะเป็นสแตกเฉพาะของตัวเอง Stack(u8) และ Stack(f64) จะไม่แชร์โค้ดกันโดยไม่ตั้งใจ

ตรวจสอบอย่างรวดเร็ว

สแตกแบบทั่วไปของคุณต้องใช้หน่วยความจำฮีปเพื่อขยาย แล้วหน่วยความจำนั้นมาจากไหน

สรุป

สแตกแบบทั่วไปคือฟังก์ชันที่ส่งคืนชนิดข้อมูลและเก็บรายการพร้อม ตัวจัดสรร push จะขยายสแตก pop จะส่งคืนค่าแบบออปชันนัล และ deinit จะคืนหน่วยความจำ 🎯

คำถามที่พบบ่อย

บทเรียน “สแตกแบบทั่วไปตั้งแต่เริ่มต้น” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “สแตกแบบทั่วไปตั้งแต่เริ่มต้น” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Zig Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “สแตกแบบทั่วไปตั้งแต่เริ่มต้น”

สแตกแบบ LIFO ที่กำหนดชนิดข้อมูลได้บนตัวจัดสรรหน่วยความจำ คุณปฏิบัติ Zig Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Zig Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Zig Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “สแตกแบบทั่วไปตั้งแต่เริ่มต้น” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Zig Academy นี้ได้ไหม

ได้ บทเรียน Zig Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สแตกแบบทั่วไปตั้งแต่เริ่มต้น
  2. รายการเชื่อมโยงทางเดียว
  3. การใช้ HashMap และ AutoHashMap
  4. การวิเคราะห์ประสิทธิภาพและข้อแลกเปลี่ยนด้านความปลอดภัย
← กลับไปที่ Zig Academy