From 451e6b1fff77bccedccdb745e4ee56cbeef31b79 Mon Sep 17 00:00:00 2001 From: Lam Wei Lun Date: Wed, 21 Jan 2026 02:46:02 +0800 Subject: Stack and Queue implementation and unit tests --- std/stack.zc | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 std/stack.zc (limited to 'std/stack.zc') diff --git a/std/stack.zc b/std/stack.zc new file mode 100644 index 0000000..3d7c3c5 --- /dev/null +++ b/std/stack.zc @@ -0,0 +1,59 @@ +import "./option.zc" +import "./mem.zc" + +struct Stack { + data: T*; + len: usize; + cap: usize; +} + +impl Stack { + fn new() -> Stack { + return Stack{data: NULL, len: 0, cap: 0}; + } + + fn free(self) { + if (self.data) { + free(self.data); + self.data = NULL; + } + self.len = 0; + } + + fn clone(self) -> Stack { + var new_stack = Stack::new(); + new_stack.len = self.len; + new_stack.cap = self.cap; + new_stack.data = malloc(sizeof(T) * new_stack.cap); + memcpy(new_stack.data, self.data, sizeof(T) * new_stack.cap); + return new_stack; + } + + fn push(self, value: T) { + if (!self.data) { + self.cap = 8; + self.data = malloc(sizeof(T) * self.cap); + } + if (self.len == self.cap) { + self.cap = self.cap * 2; + self.data = realloc(self.data, sizeof(T) * self.cap); + } + self.data[self.len] = value; + self.len = self.len + 1; + } + + fn pop(self) -> Option { + if (self.len > 0) { + var value = self.data[self.len - 1]; + self.len = self.len - 1; + return Option::Some(value); + } + return Option::None(); + } +} + +impl Drop for Stack { + fn drop(self) { + self.free(); + } +} -- cgit v1.2.3