news 2026/1/29 7:18:58

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/1/29 6:44:59

Miniconda-Python3.11镜像+pip优化技巧,提升PyTorch安装成功率

Miniconda-Python3.11镜像pip优化技巧&#xff0c;提升PyTorch安装成功率 在深度学习项目启动阶段&#xff0c;最让人沮丧的不是模型训练不收敛&#xff0c;而是连环境都装不上。你是否经历过这样的场景&#xff1a;深夜赶论文复现代码&#xff0c;pip install torch 卡在 40%&…

作者头像 李华
网站建设 2026/1/28 23:10:45

Chrome MCP Server完整实战手册:解锁AI驱动浏览器自动化的无限可能

你是否曾经为了重复性的网页操作而耗费大量时间&#xff1f;是否梦想过让AI助手帮你完成繁琐的浏览器任务&#xff1f;现在&#xff0c;Chrome MCP Server让这一切成为现实。这个基于Model Context Protocol的Chrome扩展将你的浏览器变成了AI的智能操作终端。 【免费下载链接】…

作者头像 李华
网站建设 2026/1/28 21:09:25

PotPlayer终极扩展:告别复杂工具,3步开启Twitch直播新时代

PotPlayer终极扩展&#xff1a;告别复杂工具&#xff0c;3步开启Twitch直播新时代 【免费下载链接】TwitchPotPlayer Extensions for PotPlayer to watch Twitch streams without streamlinks or any crap. 项目地址: https://gitcode.com/gh_mirrors/tw/TwitchPotPlayer …

作者头像 李华
网站建设 2026/1/28 22:24:11

Windows下Miniconda-Python3.11命令行乱码解决方法

Windows下Miniconda-Python3.11命令行乱码解决方法 在开发过程中&#xff0c;你是否曾遇到这样的场景&#xff1a;明明代码里写的是“训练完成”、“加载模型成功”&#xff0c;可运行后命令行却显示一串类似“璁缁冨畬鎴愩€佹ā鍨嬪姞杞藉畬鎴愩€侀棶棰樺彂鐢熸椂”的字符&a…

作者头像 李华
网站建设 2026/1/28 22:11:03

在Miniconda-Python3.11中使用scrapy-splash渲染JavaScript页面

在Miniconda-Python3.11中使用Scrapy-Splash渲染JavaScript页面 如今&#xff0c;越来越多的网站依赖前端框架&#xff08;如React、Vue、Angular&#xff09;动态生成内容。当你用传统爬虫抓取这些页面时&#xff0c;常常发现返回的HTML里空空如也——关键数据根本不在初始响应…

作者头像 李华
网站建设 2026/1/28 19:07:16

使用Miniconda-Python3.11构建知识图谱实体抽取服务

使用Miniconda-Python3.11构建知识图谱实体抽取服务 在当前AI驱动的知识密集型应用中&#xff0c;如何快速、稳定地从海量非结构化文本中提取关键信息&#xff0c;已成为金融风控、医疗文献分析和智能客服系统的核心挑战。比如&#xff0c;当你面对一篇医学报告时&#xff0c;能…

作者头像 李华