当前位置: 首页 > news >正文

数据结构-栈(C语言简单实现)

简介

  • 栈是一种数据结构
  • 栈可以用来存放数字
  • 一次只能向栈里加入一个数字,一次也只能从栈里获得一个数字
  • 栈里到的数字有前后顺序,先进入到的数字在前,后进入的数字在后
  • 每次从栈里获取的数字一定是最后面的数字,最后获取的数字一定是最前面的数字
  • 这种取数字的方法叫先进后出,后进先出

下面是它存储数据的过程

在这里插入图片描述

下面是它取出这三个数据的过程

上面两幅图展示了栈存储数据和取出数据的一个过程,体现了先进后出,后进先出这个特性。

代码实现

以下就是创建栈的数据结构,并且实现其功能的相关函数。

  1. 定义栈
typedef struct stack{int *arr;  // 分配存储区的首地址int cap;  // 栈中的元素个数int top;  // 入栈和出栈的位置
}stack_t;
  1. 初始化栈
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
}
  1. 释放栈
void stack_deinit(stack_t* pstack){// 释放内存,并重置为0和NULLfree(pstack->arr);pstack->arr = NULL;pstack->cap = 0;pstack->top = 0;
}
  1. 压栈
void stack_push(stack_t* pstack, int data){// 将传入的数据放到栈中pstack->arr[pstack->top++] = data;  // 先将数据放入索引为top的位置,然后将top++,往后移
}
  1. 出栈
int stack_pop(stack_t* pstack){// 当栈中有数据时,此时top肯定是指向最后一个传进去的数据后一个,此时只需将top--,之后再将数据取出即可return pstack->arr[--pstack->top];
}
  1. 判断栈是否已满
int stack_full(stack_t* pstack){// 因为top索引是从0开始的,有一个数据进来,top就加1,所以top的值就是当前栈中元素的个数,当它等于cap时,说明栈满了return pstack->top >= pstack->cap;  // 满了返回真(非0),没满返回假(0)
}
  1. 判断栈是否为空
int stack_empty(stack_t* pstack){// 参考第6条,top的值就是当前栈中元素的个数,top值为0说明为空return pstack->top == 0;  // 为空返回真(非0),不为空返回假(0)
}
  1. 获取栈中的元素个数
int stack_size(stack_t* pstack){// 参考第6条,top的值就是当前栈中元素的个数return pstack->top;
}

实例代码

创建三个文件: stack.cstack.hmain.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语言简单实现)

简介 栈是一种数据结构栈可以用来存放数字一次只能向栈里加入一个数字&#xff0c;一次也只能从栈里获得一个数字栈里到的数字有前后顺序&#xff0c;先进入到的数字在前&#xff0c;后进入的数字在后每次从栈里获取的数字一定是最后面的数字&#xff0c;最后获取的数字一定是…...

山东布谷科技直播软件源码探索高效、稳定直播传输的技术介绍:流媒体传输技术

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

LeetCode 热题 100 JavaScript -- 74. 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非递减顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 …...

任我行 CRM SQL注入漏洞复现(HW0day)

0x01 产品简介 任我行CRM&#xff08;Customer Relationship Management&#xff09;是一款专业的企业级CRM软件&#xff0c;旨在帮助企业有效管理客户关系、提升销售效率和提供个性化的客户服务。 0x02 漏洞概述 任我行 CRM SmsDataList 接口处存在SQL注入漏洞&#xff0c;未…...

[CKA]考试之集群故障排查 – kubelet故障

由于最新的CKA考试改版&#xff0c;不允许存储书签&#xff0c;本博客致力怎么一步步从官网把答案找到&#xff0c;如何修改把题做对&#xff0c;下面开始我们的 CKA之旅 题目为&#xff1a; Task 一个名为wk8s-node-0的节点状态为NotReady&#xff0c;让其他恢复至正常状态…...

VBA技术资料MF42:VBA_从Excel中上面的单元格复制公式

【分享成果&#xff0c;随喜正能量】唯有梦想才配让你不安&#xff0c;唯有行动才能解除你的不安.绳锯木断&#xff0c;水滴石穿。也许你现在做的事情很小&#xff0c;只要你能日积月累的坚持下去&#xff0c;才会发现意义非凡。所谓的成功&#xff0c;便是别人失败的时候你还在…...

ORB-SLAM2第一节---单目地图初始化

单目初始化 1.前提条件&#xff08;640*480&#xff09; 参与初始化的两帧各自的特征点数目都需要大于100.两帧特征点成功匹配的数目需要大于或等于100.两帧特征点三角化成功的三维点数目需要大于50. 2.针对条件三 流程如下 记录当前帧和参考帧&#xff08;第一帧&#xff…...

Postman 汉化及下载

Postman 是一款常用的 API 测试工具&#xff0c;可以方便地进行接口测试、调试和文档编写。本文将详细介绍如何下载安装 Postman 并汉化&#xff0c;包括每个步骤的详细说明。 下载安装 Postman 1、打开浏览器&#xff0c;访问 Postman 官网&#xff0c;下载适用于自己系统的…...

【运维】Zabbix简介及其应用领域

文章目录 1. Zabbix的背景与起源1.1. 监控工具的重要性为什么企业和个人需要监控工具&#xff1f;常见的监控挑战与需求 1.2. Zabbix的诞生背景Zabbix的发展历程Zabbix与其他监控工具的对比 2. Zabbix的核心功能2.1. 数据收集支持的数据收集方法数据的存储与历史记录 2.2. 可视…...

vue 设置了表单验证的el-input,在触发验证后无法继续输入的问题解决

问题表现 在项目中碰到的问题&#xff0c;说是input框出现验证提示后&#xff0c;该框就无法输入新的数据了 下面是我的代码&#xff1a; // dom结构 <el-form ref"addForm" :rules"addFormRules" :model"addForm" label-width"100px&…...

基于smardaten无代码开发智能巡检系统,让无人机飞得更准

目录 引言需求背景搭建思路开发过程&#xff08;1&#xff09;无人机设备数据接入&#xff08;2&#xff09;无人机巡检任务管理&#xff08;3&#xff09;无人机三维防控监视&#xff08;4&#xff09;运防一体化大屏设计&#xff08;5&#xff09;异常告警管理&#xff08;6&…...

51项目——智能垃圾桶

51项目——智能垃圾桶 文章目录 51项目——智能垃圾桶项目需求项目材料(实物图可以百度看一看)接线实战编写部分代码(需要打包好的代码可以私我)效果视频结束项目需求 人靠近,垃圾桶开盖,投放垃圾,人离开,垃圾桶自动关盖。 并屏幕显示距离,和垃圾桶开关的状态。 项目材…...

HCIP——堆叠技术

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

芯片工程师求职题目之CPU篇(3)

1. 什么是cache(缓存)&#xff1f;它的工作原理是什么&#xff1f; Cache是少量的快速内存。它位于主存储器和中央处理器之间。每当CPU请求memory位置的内容时&#xff0c;首先检查cache中是否有此数据。如果数据存在于cache中&#xff0c;CPU直接从cache中获得数据。这是更快…...

Grounding dino + segment anything + stable diffusion 实现图片编辑

目录 总体介绍总体流程 模块介绍目标检测&#xff1a; grounding dino目标分割&#xff1a;Segment Anything Model (SAM)整体思路模型结构&#xff1a;数据引擎 图片绘制 集成样例 其他问题附录 总体介绍 总体流程 本方案用到了三个步骤&#xff0c;按顺序依次为&#xff1a…...

如何选择更快更稳定的存储服务器

选择更快、更稳定的存储服务器需要考虑以下几个方面&#xff1a; 存储介质&#xff1a;存储服务器的主要存储介质包括固态硬盘&#xff08;SSD&#xff09;和机械硬盘&#xff08;HDD&#xff09;。相比于机械硬盘&#xff0c;固态硬盘具有更高的读写速度和更低的延迟&#xf…...

此芯科技加入 openKylin 开源社区

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

开发一个RISC-V上的操作系统(七)—— 硬件定时器(Hardware Timer)

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

电池的正极是带正电?

首先说明结论&#xff1a;电池正极带正电&#xff0c;负极带负电。 一个错误的实例&#xff1a; 如果说电流是从电池正极流动到电池负极&#xff0c;那么电子就是从负极流动到正极&#xff0c;那么正极就是带负电。----这个说法是错误的。这是因为&#xff0c;根据那么很出名…...

Go 协程为什么比进程和线程占用的系统资源低?

1 介绍 进程是一个程序在执行时所占据的独立虚拟内存空间&#xff0c;Linux为每个进程分配一个虚拟内存空间&#xff0c;包括栈、未使用的内存、堆、BSS、DATA和TEXT等。 线程可以看作是轻量级的进程&#xff0c;多个线程在一个进程中“共生”&#xff0c;每个线程拥有独立的…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...