栈(Stack)原理详解及 Zig / C3 双语言实现
(全文通俗易懂、排版美观、可直接复制发布)
前言
栈(Stack)是计算机科学中最基础、最重要 的数据结构,不管是考试、面试、还是底层开发,都是必学内容。
它的逻辑非常简单:先进后出,后进先出(像弹匣、像桶)。
今天我用 Zig 和 C3 两门现代系统级编程语言,带你从零实现一个静态栈,代码带中英双语注释,新手也能轻松看懂。
一、栈是什么?(超通俗解释)
栈就像一个只有一个开口的桶:
-
最先放进去的东西,在最底下
-
最后放进去的东西,在最顶上
-
拿东西只能从顶上拿
这就叫:
先进后出(First In Last Out)
后进先出(Last In First Out)
栈的核心规则
-
只能从 \\ 栈顶(top)\\ 添加数据(入栈 /push)
-
只能从 \\ 栈顶(top)\\ 删除数据(出栈 /pop)
-
不能从中间插入、不能从中间删除
-
空栈时,栈顶标记 = -1
栈能用来干什么?
-
函数调用栈
-
括号匹配检查
-
浏览器后退 / 前进
-
表达式求值
-
虚拟机、解释器底层
二、静态栈结构设计
我们使用结构体 + 数组实现栈,包含两部分:
-
数组:存储数据
-
top:标记栈顶位置(初始 = -1 表示空栈)
三、Zig 语言实现栈(完整可运行)
Zig 是一门安全、高效、现代的系统级语言,语法清晰、无隐式行为。
c
// 引入Zig标准库
// Import Zig standard library
const std = @import("std");
// 简化打印函数
// Simplify print function
const print = std.debug.print;
// 栈的最大容量
// Maximum capacity of the stack
const MAXSIZE = 5;
// 定义栈结构体(数据结构)
// Define stack struct (data structure)
const Stack = struct {
// 存储数据的数组
// Array for storing data
data: [MAXSIZE]i32 = undefined,
// 栈顶指针,初始-1表示空栈
// Stack top pointer, -1 means empty stack
top: isize = -1,
// 入栈函数:将数字压入栈顶
// Push function: add a number to the top of the stack
fn push(self: *Stack, num: i32) void {
// 判断栈是否已满
// Check if the stack is full
if (self.top == MAXSIZE - 1) {
print("栈满了,不能放啦!Stack is full, cannot push!\n", .{});
return;
}
// 栈顶上移
// Move stack top up
self.top += 1;
// 将数据存入栈顶
// Store data at stack top
self.data[@intCast(self.top)] = num;
}
// 出栈函数:从栈顶取出数据
// Pop function: remove data from the top of the stack
fn pop(self: *Stack) i32 {
// 判断栈是否为空
// Check if the stack is empty
if (self.top == -1) {
print("栈空了,拿不了啦!Stack is empty, cannot pop!\n", .{});
return -1;
}
// 获取栈顶元素
// Get the top element
const val = self.data[@intCast(self.top)];
// 栈顶下移
// Move stack top down
self.top -= 1;
return val;
}
// 获取栈顶元素(不删除)
// Get top element (without removing)
fn getTop(self: Stack) i32 {
return self.data[@intCast(self.top)];
}
// 遍历并打印栈中所有元素
// Traverse and print all elements in the stack
fn show(self: Stack) void {
print("当前栈:Current Stack: ", .{});
var i = self.top;
while (i >= 0) : (i -= 1) {
print("{} ", .{self.data[@intCast(i)]});
}
print("\n", .{});
}
};
// 主函数:程序入口
// Main function: program entry
pub fn main() void {
var s = Stack{};
s.push(10);
s.push(20);
s.push(30);
s.push(40);
s.push(50);
s.push(60);
s.show();
_ = s.pop();
s.show();
}
四、C3 语言实现栈(完整可运行)
C3 是一门类 C、低开销、安全可靠的现代系统语言,语法接近 C 语言,更容易上手。
c
import std;
const MAX = 5;
// 栈结构体:数组 + 栈顶标记
struct Point{
int[MAX] arr;
int top;
}
// 初始化栈:空栈 top = -1
fn void init(Point *s)
{
s.top = -1;
}
// 入栈
fn void push(Point *s,int num)
{
if(s.top == MAX - 1)
{
io::printn("栈满了,不能放啦!Stack is full, cannot push!");
return;
}
s.top++;
s.arr[s.top] = num;
}
// 出栈
fn int pop(Point *s)
{
if(s.top == -1)
{
io::printn("栈空了,拿不了啦!Stack is empty, cannot pop!");
return -1;
}
int val = s.arr[s.top];
s.top--;
return val;
}
// 获取栈顶元素
fn int getTop(Point *s) {
return s.arr[s.top];
}
// 遍历打印栈
fn void show(Point *s)
{
io::print("当前栈:Current Stack: ");
for(int i = s.top;i>=0;i--)
{
io::printf("%d ",s.arr[i]);
}
io::printn();
}
// 主函数
fn void main()
{
Point s;
init(&s);
push(&s, 10);
push(&s, 20);
push(&s, 30);
push(&s, 40);
push(&s, 50);
push(&s, 60);
show(&s);
pop(&s);
show(&s);
}
五、运行结果(两个语言完全一致)
Plain
栈满了,不能放啦!Stack is full, cannot push!
当前栈:Current Stack: 50 40 30 20 10
当前栈:Current Stack: 40 30 20 10
六、核心总结(新手必看)
-
栈 = 先进后出
-
top = -1 表示空栈
-
push:栈顶先上移,再存数据
-
pop:先取数据,栈顶再下移
-
Zig 和 C3 都是非常优秀的系统级现代语言
-
语法清晰、安全、高效,非常适合学习数据结构