news 2026/9/3 1:51:17

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/9/2 22:33:44

PyTorch安装完成后无法识别GPU?排查Miniconda环境配置问题

PyTorch安装完成后无法识别GPU&#xff1f;排查Miniconda环境配置问题 在深度学习项目中&#xff0c;当你满怀期待地运行训练脚本&#xff0c;却发现 torch.cuda.is_available() 返回了 False——这意味着你昂贵的NVIDIA显卡正安静地躺在机箱里“吃灰”&#xff0c;而所有计算…

作者头像 李华
网站建设 2026/9/2 22:33:05

FIFA 23 Live Editor终极指南:打造完美球队的完整教程

想要在FIFA 23中打造无敌球队&#xff0c;却苦于游戏限制&#xff1f;FIFA 23 Live Editor正是你需要的游戏修改工具&#xff0c;这款强大的实时编辑器能够让你完全掌控游戏数据&#xff0c;实现真正的游戏自由。 【免费下载链接】FIFA-23-Live-Editor FIFA 23 Live Editor 项…

作者头像 李华
网站建设 2026/9/2 22:32:29

GIMP终极美化教程:免费打造专业Photoshop风格界面

GIMP终极美化教程&#xff1a;免费打造专业Photoshop风格界面 【免费下载链接】GimpPs Gimp Theme to be more photoshop like 项目地址: https://gitcode.com/gh_mirrors/gi/GimpPs 还在为GIMP默认界面不够专业而烦恼吗&#xff1f;想要免费获得Photoshop级别的视觉体验…

作者头像 李华
网站建设 2026/9/2 22:33:33

GPU资源利用率提升秘诀:Miniconda-Python3.11镜像优化PyTorch性能

GPU资源利用率提升秘诀&#xff1a;Miniconda-Python3.11镜像优化PyTorch性能 在深度学习项目中&#xff0c;我们常常会遇到这样的情境&#xff1a;GPU显存空闲、算力闲置&#xff0c;训练进度条却走得异常缓慢。监控工具显示 nvidia-smi 的利用率长期徘徊在20%以下&#xff0c…

作者头像 李华
网站建设 2026/9/2 1:21:49

5分钟掌握Python EXE逆向分析:实战源码提取完整指南

5分钟掌握Python EXE逆向分析&#xff1a;实战源码提取完整指南 【免费下载链接】python-exe-unpacker 项目地址: https://gitcode.com/gh_mirrors/pyt/python-exe-unpacker 你是否曾经面对一个Python打包的EXE文件&#xff0c;想要了解其内部逻辑却无从下手&#xff1…

作者头像 李华
网站建设 2026/9/2 22:26:57

Anaconda配置PyTorch环境太臃肿?试试轻量级Miniconda-Python3.11镜像

Miniconda-Python3.11 镜像&#xff1a;轻量构建 PyTorch 环境的现代实践 在 AI 开发日益普及的今天&#xff0c;一个常见的场景是&#xff1a;你满怀期待地打开项目代码仓库&#xff0c;准备复现某篇论文的结果&#xff0c;却发现环境配置成了“拦路虎”——requirements.txt …

作者头像 李华