สแตกแบบทั่วไปตั้งแต่เริ่มต้น
สแตกแบบ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สแตกแบบทั่วไปตั้งแต่เริ่มต้น
- รายการเชื่อมโยงทางเดียว
- การใช้ HashMap และ AutoHashMap
- การวิเคราะห์ประสิทธิภาพและข้อแลกเปลี่ยนด้านความปลอดภัย