news 2026/6/10 15:44:22

C语言实现栈详解:从概念到完整代码 [特殊字符]

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言实现栈详解:从概念到完整代码 [特殊字符]

哈喽,各位CSDN的铁子们!今天咱们来聊聊数据结构里的基础组件——栈,并且用C语言手把手实现它。不管是刚学数据结构的新手,还是需要复习基础的老鸟,这篇笔记都能帮你理清思路,掌握栈的核心实现逻辑~

一、先搞懂:栈是什么?📚

栈(Stack)是一种先进后出(LIFO, Last In First Out)的线性数据结构,就像咱们叠盘子一样,只能从最上面放盘子(入栈),也只能从最上面拿盘子(出栈)。

核心操作就两个:

  • 入栈(Push):往栈顶添加元素

  • 出栈(Pop):从栈顶移除元素

还有两个常用辅助操作:

  • 取栈顶元素(GetTop):查看栈顶元素但不删除

  • 判空(IsEmpty):判断栈是否没有元素

栈的实现方式主要有两种:数组实现(顺序栈)和链表实现(链式栈)。今天咱们重点讲顺序栈,因为它实现简单、效率高,适合初学者入门~

二、C语言实现顺序栈:步骤拆解 🔧

顺序栈是用数组来存储栈元素,同时用一个变量(top)标记栈顶的位置。咱们一步步来实现它,从定义结构到编写核心函数。

2.1 定义栈的结构

首先要定义栈的结构体,包含两个核心部分:

  • 数组:用来存储栈中的元素

  • top:栈顶指针(其实是数组下标,标记栈顶元素的位置)

为了让代码更灵活,我们用宏定义来指定栈的最大容量,后续修改起来更方便。代码如下:

#include <stdio.h> #include <stdlib.h> // 宏定义栈的最大容量 #define MAX_SIZE 100 // 定义栈的结构体 typedef struct { int data[MAX_SIZE]; // 存储栈元素的数组 int top; // 栈顶指针(下标),初始为-1表示空栈 } Stack;

2.2 初始化栈

初始化的目的是把栈变成空栈,只需将 top 设为 -1 即可(因为数组下标从0开始,top=-1表示没有元素)。

// 初始化栈 void InitStack(Stack *stack) { stack->top = -1; // 空栈标记 }

2.3 判空操作

判断栈是否为空,只需检查 top 是否等于 -1 即可。返回1表示空,返回0表示非空。

// 判断栈是否为空 int IsEmpty(Stack *stack) { return stack->top == -1 ? 1 : 0; }

2.4 入栈操作

入栈前要先检查栈是否已满(top == MAX_SIZE - 1),如果满了就提示“栈溢出”;如果没满,就把 top 加1,再把元素存到 top 对应的数组位置。

// 入栈操作 void Push(Stack *stack, int value) { // 检查栈是否已满 if (stack->top == MAX_SIZE - 1) { printf("栈溢出!无法入栈\n"); return; } stack->top++; // 栈顶指针上移 stack->data[stack->top] = value; // 元素入栈 printf("入栈成功:%d\n", value); }

2.5 出栈操作

出栈前要先检查栈是否为空,如果为空就提示“栈为空”;如果非空,就先取出 top 对应的元素,再把 top 减1(相当于移除栈顶元素)。

// 出栈操作(返回出栈的元素) int Pop(Stack *stack) { // 检查栈是否为空 if (IsEmpty(stack)) { printf("栈为空!无法出栈\n"); exit(EXIT_FAILURE); // 异常退出 } int value = stack->data[stack->top]; // 取出栈顶元素 stack->top--; // 栈顶指针下移 printf("出栈成功:%d\n", value); return value; }

2.6 取栈顶元素

和出栈类似,先判空,然后直接返回 top 对应的元素即可(不修改 top 的值)。

// 取栈顶元素(不删除) int GetTop(Stack *stack) { if (IsEmpty(stack)) { printf("栈为空!无栈顶元素\n"); exit(EXIT_FAILURE); } return stack->data[stack->top]; }

2.7 遍历栈元素

从栈顶到栈底遍历所有元素,只需从 top 开始,依次打印数组元素,直到下标为0。

// 遍历栈(从栈顶到栈底) void TraverseStack(Stack *stack) { if (IsEmpty(stack)) { printf("栈为空!无元素可遍历\n"); return; } printf("栈中元素(从栈顶到栈底):"); for (int i = stack->top; i >= 0; i--) { printf("%d ", stack->data[i]); } printf("\n"); }

三、完整测试代码 🧪

咱们写一个主函数来测试上面的所有操作,模拟入栈、出栈、取栈顶、遍历的过程:

int main() { Stack stack; InitStack(&stack); // 初始化栈 // 测试入栈 Push(&stack, 10); Push(&stack, 20); Push(&stack, 30); Push(&stack, 40); TraverseStack(&stack); // 遍历栈 // 测试取栈顶元素 printf("当前栈顶元素:%d\n", GetTop(&stack)); // 测试出栈 Pop(&stack); Pop(&stack); TraverseStack(&stack); // 再次遍历栈 // 测试空栈出栈 Pop(&stack); Pop(&stack); Pop(&stack); // 此时栈为空,会提示错误 return 0; }

四、运行结果与说明 📊

把上面的代码复制到编译器中运行,会得到以下结果:

入栈成功:10 入栈成功:20 入栈成功:30 入栈成功:40 栈中元素(从栈顶到栈底):40 30 20 10 当前栈顶元素:40 出栈成功:40 出栈成功:30 栈中元素(从栈顶到栈底):20 10 出栈成功:20 出栈成功:10 栈为空!无法出栈

说明:

  • 入栈时按 10、20、30、40 的顺序,栈顶元素是 40,遍历结果从栈顶到栈底就是 40、30、20、10;

  • 出栈两次后,栈顶元素变成 20,遍历结果为 20、10;

  • 所有元素出栈后,栈为空,此时再执行出栈操作就会提示“栈为空!无法出栈”。

五、注意事项与拓展 ✨

  1. 顺序栈的缺点是容量固定(由 MAX_SIZE 决定),如果需要动态扩容,可以用 malloc 动态分配数组内存,后续再用 realloc 扩容;

  2. 链式栈的实现可以解决容量固定的问题,用链表的头插法实现入栈,头删法实现出栈,感兴趣的同学可以自己尝试;

  3. 栈的应用场景非常多,比如表达式求值、括号匹配、函数调用栈、回溯算法等,掌握栈的实现是学习这些应用的基础。

以上就是C语言实现顺序栈的完整教程啦!如果有疑问或者发现代码问题,欢迎在评论区留言讨论~

#C语言 #数据结构 #栈 #顺序栈 #编程笔记 #新手入门

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 21:04:30

Anaconda配置PyTorch环境后CUDA不可用?检查nvidia-smi

Anaconda配置PyTorch环境后CUDA不可用&#xff1f;先看nvidia-smi 在搭建深度学习开发环境时&#xff0c;你是否也遇到过这样的场景&#xff1a;满怀期待地装好PyTorch GPU版本&#xff0c;运行一行 torch.cuda.is_available()&#xff0c;结果却冷冷地返回 False&#xff1f;…

作者头像 李华
网站建设 2026/6/7 21:58:38

MuSiC单细胞反卷积完整指南:从入门到精通

MuSiC单细胞反卷积完整指南&#xff1a;从入门到精通 【免费下载链接】MuSiC Multi-subject Single Cell Deconvolution 项目地址: https://gitcode.com/gh_mirrors/music2/MuSiC 还在为单细胞RNA测序数据分析而烦恼吗&#xff1f;面对复杂的细胞类型鉴定和比例估计&…

作者头像 李华
网站建设 2026/6/10 11:19:56

如何让直播观众看清你的每一个操作?终极input-overlay指南

如何让直播观众看清你的每一个操作&#xff1f;终极input-overlay指南 【免费下载链接】input-overlay Show keyboard, gamepad and mouse input on stream 项目地址: https://gitcode.com/gh_mirrors/in/input-overlay 还在为直播时观众看不到你的精彩操作而烦恼吗&…

作者头像 李华
网站建设 2026/6/5 0:57:15

音乐解锁终极指南:3分钟搞定网易云QQ音乐加密文件转换

音乐解锁终极指南&#xff1a;3分钟搞定网易云QQ音乐加密文件转换 【免费下载链接】unlock-music 音乐解锁&#xff1a;移除已购音乐的加密保护。 目前支持网易云音乐(ncm)、QQ音乐(qmc, mflac, tkm, ogg) 。原作者也不知道是谁&#xff08;&#xff09; 项目地址: https://g…

作者头像 李华
网站建设 2026/6/2 21:29:17

Nucleus Co-op:单机游戏分屏技术深度解析与实战指南

Nucleus Co-op&#xff1a;单机游戏分屏技术深度解析与实战指南 【免费下载链接】splitscreenme-nucleus Nucleus Co-op is an application that starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/spl/s…

作者头像 李华
网站建设 2026/6/8 18:24:07

PyTorch安装完成后运行ResNet图像分类Demo

PyTorch安装完成后运行ResNet图像分类Demo 在深度学习项目中&#xff0c;最令人沮丧的场景之一莫过于&#xff1a;代码写完了&#xff0c;模型结构也调好了&#xff0c;结果一运行却报错——“torch not found”或者“版本冲突”。这种问题不是出在算法上&#xff0c;而是败在了…

作者头像 李华