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

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

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


前言

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

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

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


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

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

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

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

  • 拿东西只能从顶上拿

这就叫:
先进后出(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. 语法清晰、安全、高效,非常适合学习数据结构


相关推荐
To_OC1 天前
从一行报错开始,把字符串反转、回文算法连带着包装类一起捋明白
javascript·算法·api
LCG米1 天前
机器人控制系统与运动规划:从RRT算法到ROS move_base实战
算法·机器人
QiLinkOS1 天前
第三视觉理解徐玉生与他的商业活动(26)
大数据·c++·人工智能·算法·开源协议
手写码匠1 天前
手写 LLM 结构化输出引擎 —— 从 JSON Schema 约束到类型安全的数据提取
人工智能·深度学习·算法·aigc
zhiSiBuYu05171 天前
重排序(Rerank)提升检索准确率实战指南
开发语言·python·算法
月疯1 天前
华为手环的部分功能
算法
郭梧悠1 天前
算法:有效的括号
python·算法·leetcode
atunet1 天前
关于算法设计模式的演化与编程范式变迁的技术7
算法·设计模式
Jerry1 天前
LeetCode 27. 移除元素
算法
Kuakewei8881 天前
USB OVP过压保护IC 6.1V关闭输出,SOT23封装1A~3A全覆盖
嵌入式硬件