【数据结构】————栈
文章目录
- 前言
- 栈是什么,栈的特点
- 实现栈的基本操作
- 栈的相关操作声明
- 1.创建栈
- 2.对栈进行初始化
- 3.销毁栈
- 4.判断栈是否为空
- 5.压栈操作
- 6.删除栈顶元素
- 7.取出栈顶元素
- 8.计算栈内存放多少个数据
- 总结
前言
本文主要讲述特殊的线性表——栈:
栈是什么,栈的特点
数据结构中有一种特殊的线性表叫栈。
栈有一种特点:
它允许后进入的数据先拿出来。
类似一个弹夹,或是一个装砖头的容器。

栈的基本操作有如上图:
类比一个缸,缸的底端是栈底,顶端是栈顶,放入数据称为入栈,取出数据称为出栈。
对于一个栈,其特点为后进先出
Last In Fist Out
或者
先进后出
Fist Out Last In
所以在实现栈这种特殊的线性表时,当我们拿出数据的时候,只需要取栈顶元素即可,存入数据时,只需往栈顶存放数据。
综合栈的特点,在实现其结构时更适合使用数组 ,而不是链表。
当然使用链表也是可行的,相比而言:
使用链表的缺点有:
1.在压栈时总需要next的指针来维护。
2。出栈时需要记录上一个节点的位置,效率较低。
数组的方式可以解决上述两个问题,且无其他较为严重的缺点。
下面来实现栈的基本功能:
实现栈的基本操作
栈的相关操作声明
void StackInit(ST* ps);//初始化
void StackDestroy(ST* ps);
void CheckCapacity(ST** ps);//检查容量
void StackPush(ST* ps,STDataType x);//插入元素
STDataType StackPop(ST* ps);//删除栈顶元素
int StackSize(ST* ps);//计算栈有多少个数据
bool StackEmpty(ST* ps);//判断栈是否为空
STDataType StackTop(ST* ps);//取栈顶元素注:ps是指向一个结构体的指针,在main函数创建了一个结构体:ST st;并且传参传的是结构体的地址
1.创建栈
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int STDataType;
//用顺序表实现栈typedef struct Stack
{STDataType* a;int top;//插入栈顶元素int capacity;//栈的容量
}ST;
解读: 定义一个结构体:使用结构体的指针来维护数组栈
top表示栈顶的元素
capacity表示栈的容量大小
2.对栈进行初始化
void StackInit(ST* ps)//初始化
{assert(ps!=NULL);ps->a = NULL;ps->top = ps->capacity = 0;//ps->top可以初始化成-1,此时先++,再赋值//此时指向的就是栈顶元素
}
3.销毁栈
void StackDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->top = ps->capacity = 0;
}
4.判断栈是否为空
bool StackEmpty(ST* ps)//判断栈是否为空
{assert(ps);return ps->top == 0;
}
5.压栈操作
void CheckCapacity(ST**ps)//检查容量
{assert(ps != NULL);if ((*ps)->top == (*ps)->capacity){STDataType newcapacity = (*ps)->capacity == 0 ? 4 : (*ps)->capacity * 2;STDataType* tmp = (STDataType*)realloc((*ps)->a,(sizeof(STDataType)*newcapacity));//申请的空间是存放STDataType的//不是用来存放结构体的//如果第一个参数是一个NULL,realloc的作用就跟malloc一样,所以可以传NULLassert(tmp != NULL);(*ps)->a = tmp;// 把新地址给ps->a(*ps)->capacity = newcapacity;}
}void StackPush(ST* ps, STDataType x)//插入元素
{assert(ps);CheckCapacity(&ps);//这里如果传参传的是ps,相当于传值调用,在CheckCapacity函数内部申请的空间就无法返回来了。ps->a[ps->top] = x; // 先赋值,再++,因为ps->top初始化是0,就是指向栈顶元素的下一个。ps->top++;
}
解读:入栈时首先需要检查栈空间的容量大小,如果栈空间不足则需增容。
在这里分装了一个检查容量的函数。
6.删除栈顶元素
STDataType StackPop(ST* ps)//删除栈顶数据
{assert(ps);assert(!StackEmpty(ps));ps->top--;
}
7.取出栈顶元素
注:第六个函数仅仅删除栈顶元素并未拿到该数据
这里分装函数是更方便的
STDataType StackTop(ST* ps)//取栈顶元素
{assert(ps);assert(!StackEmpty(ps)); //感叹号表达式让语句的逻辑相反return ps->a[ps->top - 1];//在这里我初始化top为0,表示指向栈顶元素的下一个位置//因为初始化为0时,需要先压栈,top值再++,此时就指向了下一个位置了
}
8.计算栈内存放多少个数据
int StackSize(ST* ps)//计算栈有多少个数据
{assert(ps);assert(!StackEmpty(ps));return ps->top;
}
解读:
这里直接返回top,而不是返回top-1
因为我们在初始化的时候是将top置为0,先入栈,top再++
假如入栈三次,那么top此时就是3,但是top指向的位置是入栈的第三个元素的下一个位置。
函数基本功能如下:

总结
掌握了链表的结构之后,实现栈难度是不大的。
相关文章:
【数据结构】————栈
文章目录前言栈是什么,栈的特点实现栈的基本操作栈的相关操作声明1.创建栈2.对栈进行初始化3.销毁栈4.判断栈是否为空5.压栈操作6.删除栈顶元素7.取出栈顶元素8.计算栈内存放多少个数据总结前言 本文主要讲述特殊的线性表——栈: 栈是什么,栈…...
从零编写linux0.11 - 第十一章 可执行文件
从零编写linux0.11 - 第十一章 可执行文件 编程环境:Ubuntu 20.04、gcc-9.4.0 代码仓库:https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载(不能直接编译,需进行修改) 本章目标 本章会加载并运行…...
Win10上通过nginx代理配置远程非445端口SMB
引言 家里架了一个SMB文件服务器,想要远程访问,开了445端口,但仅限某些特殊网络可以远程访问,其他网络全部拒绝445端口,因此网上找了很多将Win10的SMB指向别的端口的教程,但所有教程均使用环回网卡解决&am…...
Allegro如何快速清除多余的规则设置操作指导
Allegro如何快速清除多余的规则设置操作指导 在用Allegro做PCB设计的时候,会给PCB设置一些规则,在PCB设计完成之后,可能会有一些没有使用到的规则,如下图 Physical规则中的45OHM的规则是多余的 单独某个规则可以直接在规则管理器中删除,如果比较多可以用下面方法批量删除…...
ROS2 入门应用 引用自定义消息(Python)
ROS2 入门应用 引用自定义消息(Python)1. 查看自定义消息2. 修改话题发布3. 修改话题订阅4. 修改依赖关系5. 编译和运行1. 查看自定义消息 引用在《ROS2 入门应用 创建自定义接口》中自定义的消息Sphere.msg ros2 interface show tutorial_interfaces/…...
SmS-Activate一款好用的短信验证码接收工具
前言 有些国外应用在使用应用上的功能时需要注册账号,由于某种不可抗因素,我们的手机号一般不支持注册,接收不到信息验证码,于是我们可以使用SmS-Activate提供的服务,使用$实现我们的需求(大概一次验证1-5…...
SpringBoot+Elasticsearch按日期实现动态创建索引(分表)
😊 作者: 一恍过去💖 主页: https://blog.csdn.net/zhuocailing3390🎊 社区: Java技术栈交流🎉 主题: SpringBootElasticsearch按日期实现动态创建索引(分表)⏱️ 创作时间&…...
Terraform基础入门 (Infrastructure as Code)
文章目录前言介绍Terraform 术语Terraform 如何工作关于provider安装开启本地缓存demo1(dockernginx)demo2(dockerzookeeperkafka)参考资料前言 像写代码一样管理基础设施。 Terraform 使用较为高级的配置文件语法来描述基础设施,这个特性让你对配置文件进行版本化…...
Redis内存回收
Redis 内存回收 Redis之所以性能很强,最主要的原因是基于内存存储,然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能 可以通过修改配置文件来设置Redis的最大内存 maxmemory <bytes>当内存达到上限时,就…...
ROS2 入门应用 引用自定义消息(C++)
ROS2 入门应用 引用自定义消息(C)1. 查看自定义消息2. 修改话题发布3. 修改话题订阅4. 修改依赖关系5. 修改编译信息6. 编译和运行1. 查看自定义消息 引用在《ROS2 入门应用 创建自定义接口》中自定义的消息Sphere.msg ros2 interface show tutorial_i…...
Spring中的数据校验
数据校验基础 参考: Java Bean Validation 规范 Spring对Bean Validation的支持 Spring定义了一个接口org.springframework.validation.Validator,用于应用相关的对象的校验器。 这个接口完全从基础设施或者上下文中脱离的,这意味着它没有…...
python批量翻译excel表格中的英文
python批量翻译excel表格中的英文需求背景主要设计分析具体实现表格操作请求百度翻译api多线程控制台显示进度完整源码需求背景 女朋友的论文需要爬取YouTube视频热评,但爬下来的都是外文。 主要设计 读取一个表格文件,获取需要翻译的文本 使用百度翻译…...
基于SSM框架的RBAC权限系统设计与 实现
基于SSM框架的RBAC权限系统设计与 实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景…...
目标检测各常见评价指标详解
注:本文仅供学习,未经同意请勿转载 说明:该博客来源于xiaobai_Ry:2020年3月笔记 对应的PDF下载链接在:待上传 目录 常见的评价指标 准确率 (Accuracy) 混淆矩阵 (Confusion Matrixÿ…...
深入讲解Kubernetes架构-控制器
在机器人技术和自动化领域,控制回路(Control Loop)是一个非终止回路,用于调节系统状态。这是一个控制环的例子:房间里的温度自动调节器。当你设置了温度,告诉了温度自动调节器你的期望状态(Desi…...
Urho3D本地化 国际化
本地化子系统提供了创建多语言应用程序的简单方法。 初始化 在使用子系统之前,需要加载本地化字符串集合。通常的做法是在应用程序启动时执行此操作。可以加载多个集合文件,每个集合文件只能定义一种或多种语言。例如: Localization* l10n…...
千锋教育嵌入式物联网教程之系统编程篇学习-04
目录 alarm函数 raise函数 abort函数 pause函数 转折点 signal函数 可重入函数 信号集 sigemptyset() sigfillset sigismember() sigaddset() sigdelset() 代码讲解 信号阻塞集 sigprocmask() alarm函数 相当于一个闹钟,默认动作是终止调用alarm函数的进…...
【运维】什么是 DevOps?
文章目录什么是 DevOps?如何实现 DevOpsDevOps工作原理: DevOps生命周期DevOps 文化DevOps 工具:构建 DevOps 工具链DevOps 和云原生开发什么是 DevSecOps?DevOps 和站点可靠性工程 (SRE)什么是 DevOps? DevOps 通过结…...
【C++入门】引用、内联函数、auto关键字、基于范围的for循环(C++11)、指针空值nullptr(C++11)
文章目录引用引用概念引用特性引用使用场景常引用内联函数宏的优缺点?C有哪些技术替代宏?auto关键字auto不能推导的场景基于范围的for循环(C11)指针空值nullptr(C11)引用 引用概念 引用不是新定义一个变量,而是给已存在变量取了一个别名&…...
《FPGA学习》->多个按键控制LED灯
🍎与其担心未来,不如现在好好努力。在这条路上,只有奋斗才能给你安全感。你若努力,全世界都会为你让路。本次项目任务,利用开发板上的4个按键KEY1,KEY2,KEY3,KEY4和2个LED灯LED1&…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

