news 2026/4/12 19:02:02

C语言:栈和队列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言:栈和队列

文章目录

    • 前言
  • 1. 栈
    • 1.1 栈的概念及结构
    • 1.2 栈的实现
    • 1.3 栈的C语言实现
      • 1.3.1 stack.h
      • 1.3.2 stack.c
      • 1.3.3 test.c
  • 2. 队列
    • 2.1 队列的概念及结构
    • 2.2 队列的实现
      • 2.2.1 Queue.h
      • 2.2.2 Queue.c
      • 2.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#include<stdio.h>#include<stdlib.h>#include<stdbool.h>#include<assert.h>typedefintSTDataType;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

代码实现:

#include"stack.h"voidSTInit(ST*pst){assert(pst);pst->a=NULL;pst->capacity=0;//top指向栈顶下一个元素pst->top=0;}voidSTDestroy(ST*pst){assert(pst);free(pst->a);pst->a=NULL;pst->capacity=pst->top=0;}//插入,入栈voidSTPush(ST*pst,STDataType x){assert(pst);if(pst->top==pst->capacity){intnewcapacity=pst->capacity==0?4:pst->capacity*2;STDataType*tmp=(STDataType*)realloc(pst->a,newcapacity*sizeof(STDataType));if(tmp==NULL){perror("realloc fail");return;}pst->a=tmp;pst->capacity=newcapacity;}pst->a[pst->top]=x;pst->top++;}//删除,出栈voidSTPop(ST*pst){assert(pst);pst->top--;}//获取栈顶数据STDataTypeSTTop(ST*pst){assert(pst);assert(pst->top>0);returnpst->a[pst->top-1];}//判空boolSTEmpty(ST*pst){assert(pst);returnpst->top==0;}//intSTSize(ST*pst){assert(pst);returnpst->top;}

这里较为复杂的是入栈void STPush(ST* pst, STDataType x),需判断内存够不够,再按需扩容!

1.3.3 test.c

#include"stack.h"intmain(){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#include<stdbool.h>#include<stdio.h>#include<stdlib.h>#include<assert.h>typedefintQDataType;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#include"Queue.h"voidQueueInit(Queue*q){assert(q);q->phead=NULL;q->ptail=NULL;q->size=0;}// 队尾入队列voidQueuePush(Queue*q,QDataType data){QNode*node=(QNode*)malloc(sizeof(QNode));if(node==NULL){perror("malloc fail");return;}node->next=NULL;node->data=data;if(q->phead==NULL){q->phead=node;q->ptail=node;}else{q->ptail->next=node;q->ptail=node;}q->size++;}// 队头出队列voidQueuePop(Queue*q){assert(q);assert(q->size!=0);QNode*m=q->phead->next;if(q->phead==q->ptail)q->ptail=NULL;free(q->phead);q->phead=m;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*node=q->phead;while(node){QNode*next=node->next;free(node);node=next;}q->phead=q->ptail=NULL;q->size=0;}

2.2.3 test.c

#include"Queue.h"intmain(){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;}

大家可刷题熟悉这两种逻辑结构😄

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

【信创】华为昇腾NLP算法训练

1. 项目概述 目标&#xff1a;在国产信创硬件上训练长文本分类模型&#xff0c;并部署 API 提供推理服务任务类型&#xff1a;多类别/二分类 NLP 问题输入数据&#xff1a;长文本&#xff08;如 2000 token&#xff09;输出&#xff1a;文本类别预测硬件环境&#xff1a; 2 A…

作者头像 李华
网站建设 2026/4/12 15:28:29

用户态热补丁技术深度解析:构建原理、适用场景与操作指南

引言 在Linux系统运维中&#xff0c;热补丁技术因其"零中断"修复特性成为关键技术。本文聚焦用户态热补丁技术&#xff0c;结合SysCare、LibcarePlus等开源方案&#xff0c;系统解析其技术原理、实施方法及注意事项&#xff0c;为运维人员提供可落地的技术指南。 一、…

作者头像 李华
网站建设 2026/4/12 15:40:10

基于SpringBoot的网上宠物店系统毕设源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。 一、研究目的 本研究旨在设计并实现一个基于SpringBoot框架的网上宠物店系统&#xff0c;以满足现代电子商务环境下宠物行业的需求。具体研究目的如下&#xff1a; 提升用…

作者头像 李华
网站建设 2026/4/11 11:00:42

基于SpringBoot的课程设计选题管理系统毕业设计源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于SpringBoot框架的课程设计选题管理系统&#xff0c;以满足高校课程设计教学过程中的选题、申报、审核、分配以及跟踪等环节的需求。…

作者头像 李华
网站建设 2026/3/25 5:48:50

K8S NodePort 与 ClusterIP Service 类型的包含关系详解

在K8S service类型中&#xff0c;NodePort 服务包含了 ClusterIP 服务的所有能力。 这是一个重要的核心概念&#xff1a;NodePort 服务是在 ClusterIP 服务基础上的扩展&#xff0c;而不是一个独立的替代品。 详细解释&#xff1a; 1. 架构层次 NodePort Service ClusterI…

作者头像 李华
网站建设 2026/4/7 16:16:52

企业渗透测试全流程实战:从合规到落地(附Word适配版)

企业渗透测试全流程实战&#xff1a;从合规到落地&#xff08;附Word适配版&#xff09; 在数字化办公与业务上云的趋势下&#xff0c;企业网络边界持续扩大&#xff0c;内部架构日趋复杂&#xff0c;传统被动防御已难以抵御针对性攻击。企业渗透测试作为“主动发现风险、前置…

作者头像 李华