C语言:栈和队列
文章目录前言1. 栈1.1 栈的概念及结构1.2 栈的实现1.3 栈的C语言实现1.3.1 stack.h1.3.2 stack.c1.3.3 test.c2. 队列2.1 队列的概念及结构2.2 队列的实现2.2.1 Queue.h2.2.2 Queue.c2.2.3 test.c前言栈先进后出和队列先进先出是逻辑结构描述数据的组织和操作规则他们可以用顺序表数组、链表等存储结构描述数据在内存中的存储方式实现。1. 栈这里我将说明什么是栈和如何用C语言表示栈1.1 栈的概念及结构接下来引用两张图片1.2 栈的实现1.3 栈的C语言实现最主要的还是如何用C语言实现栈我们将代码分别分为stack.h , stack.c , 和 test.c 这里用动态顺序表实现。1.3.1 stack.h代码展示#pragmaonce#includestdio.h#includestdlib.h#includestdbool.h#includeassert.htypedefintSTDataType;typedefstructStack{STDataType*a;inttop;intcapacity;}ST//初始化和销毁voidSTInit(ST*pst);voidSTDestroy(ST*pst);//插入,入栈voidSTPush(ST*pst,STDataType x);//删除出栈voidSTPop(ST*pst);//获取栈顶数据STDataTypeSTTop(ST*pst);//判空boolSTEmpty(ST*pst);//intSTSize(ST*pst);STDataType* a动态数组的 “容器”存储栈的实际数据区别于静态栈的固定数组int top栈的 “位置标记”记录栈顶的位置是入栈 / 出栈的核心依据注意初始值定义int capacity栈的 “容量上限”跟踪动态数组的总大小用于判断是否需要扩容避免越界1.3.2 stack.c代码实现#includestack.hvoidSTInit(ST*pst){assert(pst);pst-aNULL;pst-capacity0;//top指向栈顶下一个元素pst-top0;}voidSTDestroy(ST*pst){assert(pst);free(pst-a);pst-aNULL;pst-capacitypst-top0;}//插入,入栈voidSTPush(ST*pst,STDataType x){assert(pst);if(pst-toppst-capacity){intnewcapacitypst-capacity0?4:pst-capacity*2;STDataType*tmp(STDataType*)realloc(pst-a,newcapacity*sizeof(STDataType));if(tmpNULL){perror(realloc fail);return;}pst-atmp;pst-capacitynewcapacity;}pst-a[pst-top]x;pst-top;}//删除出栈voidSTPop(ST*pst){assert(pst);pst-top--;}//获取栈顶数据STDataTypeSTTop(ST*pst){assert(pst);assert(pst-top0);returnpst-a[pst-top-1];}//判空boolSTEmpty(ST*pst){assert(pst);returnpst-top0;}//intSTSize(ST*pst){assert(pst);returnpst-top;}这里较为复杂的是入栈void STPush(ST* pst, STDataType x)需判断内存够不够再按需扩容1.3.3 test.c#includestack.hintmain(){ST s;STInit(s);STPush(s,1);STPush(s,2);STPush(s,3);while(!STEmpty(s)){printf(%d\n,STTop(s));STPop(s);}STDestroy(s);return0;}这里我只是随便测试一下大家可以按自己的想法测试。2. 队列2.1 队列的概念及结构2.2 队列的实现这里依旧把代码分为Queue.h , Queue.c , test.c 三部分。2.2.1 Queue.h#pragmaonce#define_CRT_SECURE_NO_WARNINGS// 链式结构表示队列#pragmaonce#includestdbool.h#includestdio.h#includestdlib.h#includeassert.htypedefintQDataType;typedefstructQListNode{structQListNode*next;QDataType data;}QNode;// 队列的结构typedefstructQueue{QNode*phead;QNode*ptail;intsize;}Queue;// 初始化队列voidQueueInit(Queue*q);// 队尾入队列voidQueuePush(Queue*q,QDataType data);// 队头出队列voidQueuePop(Queue*q);// 获取队列头部元素QDataTypeQueueFront(Queue*q);// 获取队列队尾元素QDataTypeQueueBack(Queue*q);// 获取队列中有效元素个数intQueueSize(Queue*q);// 检测队列是否为空如果为空返回非零结果如果非空返回0intQueueEmpty(Queue*q);// 销毁队列voidQueueDestroy(Queue*q);QNode是链式队列的数据载体每个节点存一个数据 下一个节点的指针串联成链表Queue是链式队列的管理核心phead/ptail直接定位头尾保证入队 / 出队O(1)效率size快速统计节点数链式队列的优势动态扩容无容量上限、无 “假溢出”区别于顺序队列的循环数组是实际开发中队列的主流实现方式。size可直接计算链表结点个数2.2.2 Queue.c#define_CRT_SECURE_NO_WARNINGS#includeQueue.hvoidQueueInit(Queue*q){assert(q);q-pheadNULL;q-ptailNULL;q-size0;}// 队尾入队列voidQueuePush(Queue*q,QDataType data){QNode*node(QNode*)malloc(sizeof(QNode));if(nodeNULL){perror(malloc fail);return;}node-nextNULL;node-datadata;if(q-pheadNULL){q-pheadnode;q-ptailnode;}else{q-ptail-nextnode;q-ptailnode;}q-size;}// 队头出队列voidQueuePop(Queue*q){assert(q);assert(q-size!0);QNode*mq-phead-next;if(q-pheadq-ptail)q-ptailNULL;free(q-phead);q-pheadm;q-size--;}//// 获取队列头部元素QDataTypeQueueFront(Queue*q){assert(q);returnq-phead-data;}//// 获取队列队尾元素QDataTypeQueueBack(Queue*q){assert(q);returnq-ptail-data;}//// 获取队列中有效元素个数intQueueSize(Queue*q){returnq-size;}//// 检测队列是否为空如果为空返回非零结果如果非空返回0intQueueEmpty(Queue*q){if(q-phead!NULL){return0;}return1;}//// 销毁队列voidQueueDestroy(Queue*q){assert(q);QNode*nodeq-phead;while(node){QNode*nextnode-next;free(node);nodenext;}q-pheadq-ptailNULL;q-size0;}2.2.3 test.c#includeQueue.hintmain(){Queue q;QueueInit(q);QueuePush(q,1);QueuePush(q,2);QueuePush(q,3);QueuePush(q,4);while(!QueueEmpty(q)){printf(%d ,QueueFront(q));QueuePop(q);}return0;}大家可刷题熟悉这两种逻辑结构

相关新闻

一文读懂 HDMI 矩阵:分类、特性、场景全攻略,告别信号切换难题

一文读懂 HDMI 矩阵:分类、特性、场景全攻略,告别信号切换难题

从高等数学线性代数的矩阵概念延伸来看,信号传输领域中的矩阵,通常指在多路输入场景下具备多路输出选择功能的结构模式,形成类似矩阵的信号分配架构。其核心特性为:每一路输出可单独与任意一路输入信号建立连接(即“短…

2026/7/4 7:54:49 阅读更多 →
基于Simulink的电机轴电压与轴电流抑制仿真

基于Simulink的电机轴电压与轴电流抑制仿真

目录 手把手教你学Simulink 一、引言:为什么“新电机用半年就轴承烧毁”?——轴电压是隐形杀手! 二、轴电压产生机理:从PWM到轴承电蚀的路径 1. 共模电压来源 2. 耦合路径:寄生电容网络 三、应用场景:新能源汽车驱动电机的轴承保护设计 系统参数 设计目标 四、建…

2026/7/3 9:53:06 阅读更多 →
【2026 年最新】win11一定要关闭系统更新!附4种彻底关闭系统更新的方法, Win11 永久关闭自动更新的 4 个靠谱方法

【2026 年最新】win11一定要关闭系统更新!附4种彻底关闭系统更新的方法, Win11 永久关闭自动更新的 4 个靠谱方法

为什么说win11一定关闭系统更新? 自动重启风险高:系统未经允许就会在后台安装更新并重启,严重影响使用。驱动或外设不兼容:更新后打印机、摄像头等设备出现异常。性能下降:新版本不一定优化,有时反而拖慢运…

2026/7/5 23:03:25 阅读更多 →

最新新闻

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
免费二维码修复工具终极指南:三步拯救损坏二维码

免费二维码修复工具终极指南:三步拯救损坏二维码

免费二维码修复工具终极指南:三步拯救损坏二维码 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否曾经面对一个损坏的二维码束手无策?模糊、破损、打印质量差的二…

2026/7/5 23:59:17 阅读更多 →
AsrTools:如何用一款开源工具在5分钟内完成专业级语音转文字?

AsrTools:如何用一款开源工具在5分钟内完成专业级语音转文字?

AsrTools:如何用一款开源工具在5分钟内完成专业级语音转文字? 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your au…

2026/7/5 23:57:17 阅读更多 →
YOLOv8融合坐标注意力机制优化目标检测性能

YOLOv8融合坐标注意力机制优化目标检测性能

1. YOLOv8与坐标注意力机制融合背景目标检测作为计算机视觉的基础任务,其发展始终围绕精度与速度的平衡展开。YOLO系列算法因其"一次检测"的设计理念,在实时性上具有先天优势。YOLOv8作为该系列的最新代表作,通过更深的网络结构、更…

2026/7/5 23:55:16 阅读更多 →
基于深度学习的工程图纸形位公差自动识别技术解析

基于深度学习的工程图纸形位公差自动识别技术解析

1. 项目背景与核心价值在机械制造和工程图纸设计领域,形位公差的标注与识别一直是影响生产效率的关键环节。传统的人工识别方式不仅耗时费力,而且容易因视觉疲劳导致误判。我们团队开发的"简会图纸识别系统"正是为了解决这一行业痛点而生。这套…

2026/7/5 23:53:15 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻