数据结构-栈(C语言简单实现)
简介
- 栈是一种数据结构
- 栈可以用来存放数字
- 一次只能向栈里加入一个数字,一次也只能从栈里获得一个数字
- 栈里到的数字有前后顺序,先进入到的数字在前,后进入的数字在后
- 每次从栈里获取的数字一定是最后面的数字,最后获取的数字一定是最前面的数字
- 这种取数字的方法叫先进后出,后进先出
下面是它存储数据的过程
下面是它取出这三个数据的过程
上面两幅图展示了栈存储数据和取出数据的一个过程,体现了先进后出,后进先出这个特性。
代码实现
以下就是创建栈的数据结构,并且实现其功能的相关函数。
- 定义栈
typedef struct stack{int *arr; // 分配存储区的首地址int cap; // 栈中的元素个数int top; // 入栈和出栈的位置
}stack_t;
- 初始化栈
void stack_init(stack_t* pstack, int cap){pstack->arr = malloc(sizeof(int) * cap); // 分配内存给存储区if(pstack->arr == NULL){printf("栈的存储区分配失败!\n");return;}pstack->cap = cap; // 初始化传入的元素个数pstack->top = 0; // 一开始入栈的索引是在0
}
- 释放栈
void stack_deinit(stack_t* pstack){// 释放内存,并重置为0和NULLfree(pstack->arr);pstack->arr = NULL;pstack->cap = 0;pstack->top = 0;
}
- 压栈
void stack_push(stack_t* pstack, int data){// 将传入的数据放到栈中pstack->arr[pstack->top++] = data; // 先将数据放入索引为top的位置,然后将top++,往后移
}
- 出栈
int stack_pop(stack_t* pstack){// 当栈中有数据时,此时top肯定是指向最后一个传进去的数据后一个,此时只需将top--,之后再将数据取出即可return pstack->arr[--pstack->top];
}
- 判断栈是否已满
int stack_full(stack_t* pstack){// 因为top索引是从0开始的,有一个数据进来,top就加1,所以top的值就是当前栈中元素的个数,当它等于cap时,说明栈满了return pstack->top >= pstack->cap; // 满了返回真(非0),没满返回假(0)
}
- 判断栈是否为空
int stack_empty(stack_t* pstack){// 参考第6条,top的值就是当前栈中元素的个数,top值为0说明为空return pstack->top == 0; // 为空返回真(非0),不为空返回假(0)
}
- 获取栈中的元素个数
int stack_size(stack_t* pstack){// 参考第6条,top的值就是当前栈中元素的个数return pstack->top;
}
实例代码
创建三个文件: stack.c
,stack.h
,main.c
stack.c
定义栈具体的函数
#include "stack.h"// 初始化栈
void stack_init(stack_t* pstack, int cap){pstack->arr = malloc(sizeof(int) * cap);if(pstack->arr == NULL){printf("栈的存储区分配失败!\n");return;}pstack->cap = cap;pstack->top = 0;
}// 释放栈
void stack_deinit(stack_t* pstack){free(pstack->arr);pstack->arr = NULL;pstack->cap = 0;pstack->top = 0;
}// 压栈
void stack_pull(stack_t* pstack, int data){pstack->arr[pstack->top++] = data;
}// 出栈
int stack_pop(stack_t* pstack){return pstack->arr[--pstack->top];
}// 判断栈是否已满
int stack_full(stack_t* pstack){return pstack->top >= pstack->cap;
}// 判断栈是否为空
int stack_empty(stack_t* pstack){return pstack->top == 0;
}// 获取栈中的元素个数
int stack_size(stack_t* pstack){return pstack->top;
}
stack.h
声明栈的相关函数和定义栈
#ifndef __STACK_H // 头卫士
#define __STACK_H
#include <stdio.h>
#include <stdlib.h>// 定义栈的数据结构
typedef struct stack{int* arr;int cap;int top;
}stack_t;// 声明栈的函数
extern void stack_init(stack_t* pstack, int cap);
extern void stack_deinit(stack_t* pstack);
extern void stack_pull(stack_t* pstack, int data);
extern int stack_pop(stack_t* pstack);
extern int stack_full(stack_t* pstack);
extern int stack_empty(stack_t* pstack);
extern int stack_size(stack_t* pstack);
#endif
main.c
主函数使用栈
#include "stack.h"int main(void){// 1. 声明一个栈: stackstack_t stack;// 2. 初始化stackstack_init(&stack, 5);// 3. 将栈放满数据int data = 100;printf("开始放入数据: ");while(!stack_full(&stack)){// 没满的状态下,放入数据printf("%d ", data);stack_pull(&stack, data++);}printf("结束!\n");printf("此时栈中元素个数为: %d\n\n", stack_size(&stack));// 4. 将栈中的数据一个个取出来printf("开始取出数据: ");while(!stack_empty(&stack)){// 非空的状态,取数据data = stack_pop(&stack);printf("%d ", data);}printf("结束!\n");printf("此时栈中元素个数为: %d\n\n", stack_size(&stack));// 5. 释放栈stack_deinit(&stack);return 0;
}
相关文章:

数据结构-栈(C语言简单实现)
简介 栈是一种数据结构栈可以用来存放数字一次只能向栈里加入一个数字,一次也只能从栈里获得一个数字栈里到的数字有前后顺序,先进入到的数字在前,后进入的数字在后每次从栈里获取的数字一定是最后面的数字,最后获取的数字一定是…...

山东布谷科技直播软件源码探索高效、稳定直播传输的技术介绍:流媒体传输技术
今天我们探索的是让直播软件源码平台在直播时能够高效、稳定的进行直播传输的技术,而这个技术就是直播软件源码平台的流媒体传输技术,在直播软件源码平台中,流媒体传输技术会将直播的图像、视频、音频等相关的流媒体信号通过网络传递到用户的…...

LeetCode 热题 100 JavaScript -- 74. 搜索二维矩阵
给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非递减顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。 …...

任我行 CRM SQL注入漏洞复现(HW0day)
0x01 产品简介 任我行CRM(Customer Relationship Management)是一款专业的企业级CRM软件,旨在帮助企业有效管理客户关系、提升销售效率和提供个性化的客户服务。 0x02 漏洞概述 任我行 CRM SmsDataList 接口处存在SQL注入漏洞,未…...
[CKA]考试之集群故障排查 – kubelet故障
由于最新的CKA考试改版,不允许存储书签,本博客致力怎么一步步从官网把答案找到,如何修改把题做对,下面开始我们的 CKA之旅 题目为: Task 一个名为wk8s-node-0的节点状态为NotReady,让其他恢复至正常状态…...

VBA技术资料MF42:VBA_从Excel中上面的单元格复制公式
【分享成果,随喜正能量】唯有梦想才配让你不安,唯有行动才能解除你的不安.绳锯木断,水滴石穿。也许你现在做的事情很小,只要你能日积月累的坚持下去,才会发现意义非凡。所谓的成功,便是别人失败的时候你还在…...

ORB-SLAM2第一节---单目地图初始化
单目初始化 1.前提条件(640*480) 参与初始化的两帧各自的特征点数目都需要大于100.两帧特征点成功匹配的数目需要大于或等于100.两帧特征点三角化成功的三维点数目需要大于50. 2.针对条件三 流程如下 记录当前帧和参考帧(第一帧ÿ…...

Postman 汉化及下载
Postman 是一款常用的 API 测试工具,可以方便地进行接口测试、调试和文档编写。本文将详细介绍如何下载安装 Postman 并汉化,包括每个步骤的详细说明。 下载安装 Postman 1、打开浏览器,访问 Postman 官网,下载适用于自己系统的…...
【运维】Zabbix简介及其应用领域
文章目录 1. Zabbix的背景与起源1.1. 监控工具的重要性为什么企业和个人需要监控工具?常见的监控挑战与需求 1.2. Zabbix的诞生背景Zabbix的发展历程Zabbix与其他监控工具的对比 2. Zabbix的核心功能2.1. 数据收集支持的数据收集方法数据的存储与历史记录 2.2. 可视…...

vue 设置了表单验证的el-input,在触发验证后无法继续输入的问题解决
问题表现 在项目中碰到的问题,说是input框出现验证提示后,该框就无法输入新的数据了 下面是我的代码: // dom结构 <el-form ref"addForm" :rules"addFormRules" :model"addForm" label-width"100px&…...

基于smardaten无代码开发智能巡检系统,让无人机飞得更准
目录 引言需求背景搭建思路开发过程(1)无人机设备数据接入(2)无人机巡检任务管理(3)无人机三维防控监视(4)运防一体化大屏设计(5)异常告警管理(6&…...
51项目——智能垃圾桶
51项目——智能垃圾桶 文章目录 51项目——智能垃圾桶项目需求项目材料(实物图可以百度看一看)接线实战编写部分代码(需要打包好的代码可以私我)效果视频结束项目需求 人靠近,垃圾桶开盖,投放垃圾,人离开,垃圾桶自动关盖。 并屏幕显示距离,和垃圾桶开关的状态。 项目材…...

HCIP——堆叠技术
堆叠 一、简介二、堆叠的优势1、提高可靠性2、简化组网3、简化管理4、强大的网络拓展能力 三、堆叠的方式1、堆叠卡堆叠2、业务口堆叠 四、堆叠的原理1、角色2、单机堆叠3、堆叠ID4、堆叠的优先级5、堆叠的建立过程 五、堆叠的配置 一、简介 堆叠技术 — 可以将多台真是得物理…...

芯片工程师求职题目之CPU篇(3)
1. 什么是cache(缓存)?它的工作原理是什么? Cache是少量的快速内存。它位于主存储器和中央处理器之间。每当CPU请求memory位置的内容时,首先检查cache中是否有此数据。如果数据存在于cache中,CPU直接从cache中获得数据。这是更快…...

Grounding dino + segment anything + stable diffusion 实现图片编辑
目录 总体介绍总体流程 模块介绍目标检测: grounding dino目标分割:Segment Anything Model (SAM)整体思路模型结构:数据引擎 图片绘制 集成样例 其他问题附录 总体介绍 总体流程 本方案用到了三个步骤,按顺序依次为:…...
如何选择更快更稳定的存储服务器
选择更快、更稳定的存储服务器需要考虑以下几个方面: 存储介质:存储服务器的主要存储介质包括固态硬盘(SSD)和机械硬盘(HDD)。相比于机械硬盘,固态硬盘具有更高的读写速度和更低的延迟…...

此芯科技加入 openKylin 开源社区
导读近日消息,据此芯科技官方公众号表示,此芯科技目前已经签署 openKylin 社区 CLA(Contributor License Agreement 贡献者许可协议),正式加入 openKylin 开源社区。 此芯科技成立于 2021 年,是一家专注于设…...

开发一个RISC-V上的操作系统(七)—— 硬件定时器(Hardware Timer)
目录 往期文章传送门 一、硬件定时器 硬件实现 软件实现 二、上板测试 往期文章传送门 开发一个RISC-V上的操作系统(一)—— 环境搭建_riscv开发环境_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统(二)—— 系统引导…...

电池的正极是带正电?
首先说明结论:电池正极带正电,负极带负电。 一个错误的实例: 如果说电流是从电池正极流动到电池负极,那么电子就是从负极流动到正极,那么正极就是带负电。----这个说法是错误的。这是因为,根据那么很出名…...
Go 协程为什么比进程和线程占用的系统资源低?
1 介绍 进程是一个程序在执行时所占据的独立虚拟内存空间,Linux为每个进程分配一个虚拟内存空间,包括栈、未使用的内存、堆、BSS、DATA和TEXT等。 线程可以看作是轻量级的进程,多个线程在一个进程中“共生”,每个线程拥有独立的…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...
从0开始一篇文章学习Nginx
Nginx服务 HTTP介绍 ## HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 ## HTTP工作在 TCP/IP协议体系中的TCP协议上&#…...