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


相关推荐
2601_954526754 分钟前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
qq_4480111621 分钟前
C语言中的变量和函数的定义与声明
android·c语言·开发语言
零涂毕业设计1 小时前
毕业设计模块开发-OLED显示屏(IIC协议0.96寸)STM32 ESP32 FPGA Linux驱动免费分享
linux·stm32·单片机·嵌入式·esp32·fpga·oled
叩码以求索1 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
阿龙的工作记录2 小时前
深入理解Linux设备驱动模型
linux·嵌入式硬件·工作记录
ye150127774552 小时前
220V转5V1A隔离芯片WT5602
单片机·嵌入式硬件·其他·硬件工程
c238563 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
武汉万象奥科3 小时前
AGV导航控制器方案 | 基于HD-RK3576系列核心板的算控融合一体化平台
arm开发·嵌入式硬件·arm核心板·单板机
aaaameliaaa4 小时前
指针之总结
c语言·笔记·算法
ye150127774554 小时前
DC24V-100V转3.3V500mA隔离芯片WT5602
单片机·嵌入式硬件·其他·硬件工程