[特殊字符]栈(Stack)原理详解 \+ Zig / C3 双语言实现

栈(Stack)原理详解及 Zig / C3 双语言实现

(全文通俗易懂、排版美观、可直接复制发布)


前言

栈(Stack)是计算机科学中最基础、最重要 的数据结构,不管是考试、面试、还是底层开发,都是必学内容。

它的逻辑非常简单:先进后出,后进先出(像弹匣、像桶)。

今天我用 Zig 和 C3 两门现代系统级编程语言,带你从零实现一个静态栈,代码带中英双语注释,新手也能轻松看懂。


一、栈是什么?(超通俗解释)

栈就像一个只有一个开口的桶:

  • 最先放进去的东西,在最底下

  • 最后放进去的东西,在最顶上

  • 拿东西只能从顶上拿

这就叫:
先进后出(First In Last Out)
后进先出(Last In First Out)

栈的核心规则

  1. 只能从 \\ 栈顶(top)\\ 添加数据(入栈 /push)

  2. 只能从 \\ 栈顶(top)\\ 删除数据(出栈 /pop)

  3. 不能从中间插入、不能从中间删除

  4. 空栈时,栈顶标记 = -1

栈能用来干什么?

  • 函数调用栈

  • 括号匹配检查

  • 浏览器后退 / 前进

  • 表达式求值

  • 虚拟机、解释器底层


二、静态栈结构设计

我们使用结构体 + 数组实现栈,包含两部分:

  1. 数组:存储数据

  2. 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

六、核心总结(新手必看)

  1. 栈 = 先进后出

  2. top = -1 表示空栈

  3. push:栈顶先上移,再存数据

  4. pop:先取数据,栈顶再下移

  5. Zig 和 C3 都是非常优秀的系统级现代语言

  6. 语法清晰、安全、高效,非常适合学习数据结构


相关推荐
Navigator_Z10 小时前
LeetCode //C - 1289. Minimum Falling Path Sum II
c语言·算法·leetcode
CCblandy10 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
himobrinehacken10 小时前
取模运算的汇编奥秘揭秘
c语言·安全
Tronlong创龙11 小时前
SBC‑TLT153 嵌入式 Linux 应用开发,交叉编译与 GDB 调试实践(上)
嵌入式硬件·嵌入式开发·硬件开发·工业控制·工业开发板
YangYang9YangYan12 小时前
2027供应链计划校招:数学与应用数学专业如何把预测模型讲成业务决策?
人工智能·sql·算法
巴渝小禹12 小时前
单片机死循环delay_us()计算方法
单片机·嵌入式硬件
Yiran_G12 小时前
LoRa串口模组和SoC模组怎么选?从MCU架构看无线通信方案设计
嵌入式硬件·物联网
jsjzsl212 小时前
递归自改进系统(RSI)的本质是自发对称破缺:智能爆炸有界—— AI研发切记盲目投入
人工智能·python·算法
程序员清风12 小时前
最短路径算法:BFS、Dijkstra 与 Floyd
java·算法·宽度优先
梦帮科技12 小时前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法