news 2026/4/27 8:49:43

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/4/24 3:32:29

Widevine L3 DRM 绕过工具使用指南

Widevine L3 DRM 绕过工具使用指南 【免费下载链接】widevine-l3-decryptor A Chrome extension that demonstrates bypassing Widevine L3 DRM 项目地址: https://gitcode.com/gh_mirrors/wi/widevine-l3-decryptor 项目概述 Widevine L3 Decryptor 是一个专门针对 Ch…

作者头像 李华
网站建设 2026/4/19 0:32:08

Python安装后无法识别命令?Miniconda环境变量修复

Python安装后无法识别命令&#xff1f;Miniconda环境变量修复 在搭建数据科学或AI开发环境时&#xff0c;你是否曾遇到这样的场景&#xff1a;刚装完 Miniconda&#xff0c;信心满满地在终端敲下 python --version&#xff0c;结果却返回一个冷冰冰的错误&#xff1a; bash: py…

作者头像 李华
网站建设 2026/4/25 9:25:43

缠论框架实战指南:3天掌握自动化交易分析

缠论框架实战指南&#xff1a;3天掌握自动化交易分析 【免费下载链接】chan.py 开放式的缠论python实现框架&#xff0c;支持形态学/动力学买卖点分析计算&#xff0c;多级别K线联立&#xff0c;区间套策略&#xff0c;可视化绘图&#xff0c;多种数据接入&#xff0c;策略开发…

作者头像 李华
网站建设 2026/4/25 7:36:48

Android音频可视化开发实战:从入门到精通

Android音频可视化开发实战&#xff1a;从入门到精通 【免费下载链接】android-audio-visualizer :musical_score: :musical_keyboard: :musical_note: Audio visualisation for android MediaPlayer :sound: 项目地址: https://gitcode.com/gh_mirrors/an/android-audio-vi…

作者头像 李华
网站建设 2026/4/17 18:05:38

从零开始掌握Proteus元件库对照表(模拟篇)手把手教程

从零开始掌握Proteus模拟元件查找&#xff1a;新手避坑指南与实战对照手册 你有没有遇到过这样的情况&#xff1f;想在Proteus里搭一个简单的运放放大电路&#xff0c;结果点开“P”按钮后&#xff0c;在茫茫元件库里翻了半天&#xff0c;输入“运算放大器”搜不到&#xff0c;…

作者头像 李华
网站建设 2026/4/18 7:51:48

PoeCharm实战指南:5个步骤解决BD构建难题,让你的角色伤害翻倍

你是否曾经在《流放之路》中投入大量资源后&#xff0c;发现角色的伤害输出依然停滞不前&#xff1f;&#x1f914; 当其他玩家的DPS轻松突破百万时&#xff0c;你的角色却卡在50-60万区间无法突破&#xff1f;这就是PoeCharm要解决的核心问题——通过科学的BD构建分析&#xf…

作者头像 李华