[特殊字符]栈(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. 语法清晰、安全、高效,非常适合学习数据结构


相关推荐
滴滴答滴答答2 小时前
LeetCode Hot100 之 41 缺失的第一个正数
算法·leetcode·职场和发展
rgb2gray2 小时前
论文详解:基于POI与出租车轨迹的城市多中心结构静态-动态多重分形特征
人工智能·python·算法·机器学习·数据分析·可解释
jz_ddk2 小时前
[实战] CIC滤波器设计与实现
人工智能·算法·机器学习·数字信号处理·cic滤波器
浮若于心2 小时前
WSL2 Ubuntu 占用 C 盘空间清理指南
linux·c语言·ubuntu
Sakinol#2 小时前
Leetcode Hot 100 ——多维动态规划
算法·leetcode·动态规划
XZXZZX2 小时前
ATCODER ABC 450 C题解
c++·算法·ccf csp
堕2742 小时前
JavaEE初阶——《多线程--. 多线程带来的的⻛险-线程安全 (重点)》
java·算法·java-ee
像素猎人2 小时前
差分数组【自用笔记】【c++】
c++·笔记·算法
特蕾西娅今天也在迷茫2 小时前
计算机编码和编码的那些事
c语言·其他·预编码