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


相关推荐
qeen874 分钟前
【数据结构】栈及其C语言模拟实现
c语言·数据结构·学习·
北顾笙9805 分钟前
day26-数据结构力扣
数据结构·算法·leetcode
我不是懒洋洋8 分钟前
深入理解C语言指针:从一级指针到函数指针
c语言
椰羊~王小美16 分钟前
嵌入式 和 单片机
java·单片机·嵌入式硬件
德索精密工业-胡工28 分钟前
M12连接器的增强技术:在高电磁干扰的车间里它是如何“活下来”的?
算法
ZenosDoron29 分钟前
函数形参传数组
java·jvm·算法
极客天成ScaleFlash29 分钟前
极客天成 NVFile 存算融合解决方案
算法·数据挖掘
Reisentyan40 分钟前
[杭电春季联赛5]1004 赛马
算法
雨墨✘1 小时前
基于比较的三种排序算法:插入排序、合并排序和快排序
数据结构·算法·排序算法
熬夜敲代码的猫1 小时前
C/C++:内存管理
c语言·c++·动态内存管理