【数据结构】栈的使用

栈(Stack)是一种基本的数据结构,它是一种线性表,但只允许在固定的一端进行插入和删除操作,这一端称为栈顶(top)。栈的特点是后进先出(Last In First Out, LIFO),即最后进入栈的元素最先被取出。

栈可以用数组来实现,也可以用链表来实现。用数组实现的栈称为顺序栈,用链表实现的栈称为链式栈。

顺序栈的特点是:

  • 存储空间连续。
  • 提前分配固定大小的存储空间,可能会造成空间浪费,或者空间不足时需要动态扩容。
  • 访问速度快,因为支持随机访问。

链式栈的特点是:

  • 存储空间不连续。
  • 动态分配空间,不会造成空间浪费,也不会出现空间不足的问题。
  • 访问速度相对较慢,因为不支持随机访问。

以下我来讲解一下顺序栈的使用

1.顺序栈的结构体定义

#define N 5

顺序栈结构定义
#define N 5
typedef struct
{
    int a[N];//数据域 存数据
    int top;//栈针
}stack_t;
顺序栈操作
1. 创建一个空的栈 === 创建一个空的顺序表 createEmptyStack ()
2. 判断栈是否为满 === 判断顺序表是否为满 isFullStack ()
3. 判断栈是否为空 === 判断顺序表是否为空 isEmptyStack ()
4. 入栈 === 在顺序表的尾巴上插入一个数据 有效元素个数 + 1 inStack ()
5. 出栈 === 删除顺序表的尾巴 尾巴里面的数据返回 有效元素个数 - 1 outStack ()
6. 获取栈顶元素 === 将顺序表的尾巴节点里面的数据域返回 getTopStack ()
7. 清空栈 === 清空顺序表 clearEmptyStack ()

2.创建一个空的栈

stack_t * createEmptyStack ()
{
        stack_t * p = malloc ( sizeof ( stack_t ));
        if ( p == NULL )
        {
                printf ( "createEmptyStack malloc failed!!\n" );
                return NULL ;
        }
        p -> top = 0 ; // 因为是空的栈 , 所以有效元素个数为 0
        return p ;
}

3. 判断栈是否为满,满返回1,未满返回0

int isFullStack ( stack_t * p )
{
        return p -> top == N ? 1 : 0 ;
}

4. 入栈,是插入,在数组尾巴插入一个数据

int pushStack ( stack_t * p , int x )
{
        //0.容错判断
        if ( isFullStack ( p ))
        {
                printf ( "isFullStack!!!\n" ); // 栈满 , 入栈失败
                return - 1 ;
        }
        //1.入栈
        p -> a [ p -> top ] = x ;
        //2.将入栈的元素变为有效 , 有效元素个数 +1
        p -> top ++ ;
        return 0 ;
}

5.判断是否为空 1 代表空 0代表未空

int isEmptyStack ( stack_t * p )
{
        return p -> top == 0 ? 1 : 0 ;
}

6.出栈,将数组的尾巴元素删除,同时将删除的数据值返回

int popStack ( stack_t * p )
{
        //0.容错判断
        if ( isEmptyStack ( p ))
        {
                printf ( "isEmptyStack!!!\n" ); // 空栈 , 出栈失败
                return - 1 ;
        }
        //1.出栈 , 将数组的最后一个有效元素删除
        p -> top -- ; // 有效元素个数 -1, 相当于将栈顶元素删除
        //2.将出栈元素的值返回
        //上面的 p->top-- 之后 ,p->top 里面保存的是出栈元素的下标
        return p -> a [ p -> top ];
}

7. 获取栈顶元素的值

int getTopValue ( stack_t * p )
{
        return p -> a [ p -> top - 1 ]; // p->top-1 得到最后一个有效元素的下标 , 即栈顶元素的下标
}

8. 清空栈

void clearStack ( stack_t * p )
{
        p -> top = 0 ; // 有效元素赋值为 0
}

结语

以上就是栈的基本使用,本次代码分享到此结束,后续还会分享数据结构的知识。
最后的最后,还请大家点点赞,点点关注,谢谢大家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/552828.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROS 2边学边练(27)-- 创建一个launch文件

前言 ROS 2中的启动系统负责帮助用户描述其系统的配置,然后按描述执行。系统的配置包括运行什么程序,在哪里运行,传递什么参数,以及ROS特定的约定,这些约定通过为每个组件提供不同的配置,使其易于在整个系统…

[stm32]DMA使用

自动重装和M2M(软件trig)不能一起使用,否则会停不下来 void MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size){RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);DMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_PeripheralBaseAddrAddrA;//外…

go语言并发实战——日志收集系统(三) 利用sarama包连接KafKa实现消息的生产与消费

环境的搭建 Kafka以及相关组件的下载 我们要实现今天的内容,不可避免的要进行对开发环境的配置,Kafka环境的配置比较繁琐,需要配置JDK,Scala,ZoopKeeper和Kafka,这里我们不做赘述,如果大家不知道如何配置环境&#x…

STM32芯片flash被锁导致Error Flash Download failed Cortex-M4,解决办法(全)亲测有效

STM32芯片flash被锁导致Error: Flash Download failed - "Cortex-M4",解决办法(全)亲测有效🤩! 方法1:由于Keil 中debug的仿真器配置出错导致的下载失败(这种问题虽然是低级错误&…

友思特应用 | 红外视角的延伸:短波红外相机的机器视觉应用

导读 短波红外SWIR在不同波段针对不同材料的独特成像特征为各领域检测应用的拓宽提供了基础。本文将展现短波红外成像技术在水分检测、塑料检测、太阳能电池板检查和矿场开采等领域的丰富应用案例,讨论短波红外相机在未来的发展方向。 SWIR 背景简介 短波红外 &am…

基于SpringBoot+Vue的IT技术交流平台(源码+文档+包运行)

一.系统概述 我国科学技术的不断发展,计算机的应用日渐成熟,其强大的功能给人们留下深刻的印象,它已经应用到了人类社会的各个层次的领域,发挥着重要的不可替换的作用。信息管理作为计算机应用的一部分,使用计算机进行…

PHP货运搬家/拉货小程序二开源码搭建的功能

运搬家/拉货小程序的二次开发可以添加许多功能,以增强用户体验和提高业务效率。以下是一些可能的功能: 用户端功能: 注册登录:允许用户创建个人账户并登录以使用应用程序。货物发布:允许用户发布他们需要搬运的货物信息…

OpenHarmony实战开发-如何通过分割swiper区域,实现指示器导航点位于swiper下方的效果。

介绍 本示例介绍通过分割swiper区域,实现指示器导航点位于swiper下方的效果。 效果预览图 使用说明 1.加载完成后swiper指示器导航点,位于显示内容下方。 实现思路 1.将swiper区域分割为两块区域,上方为内容区域,下方为空白区…

HAL STM32 I2C方式读取MT6701磁编码器获取角度例程

HAL STM32 I2C方式读取MT6701磁编码器获取角度例程 📍相关篇《Arduino通过I2C驱动MT6701磁编码器并读取角度数据》🎈《STM32 软件I2C方式读取MT6701磁编码器获取角度例程》📌MT6701当前最新文档资料:https://www.magntek.com.cn/u…

生产服务器变卡怎么排查

服务器变卡怎么排查,可以从以下四个方面去考虑 生产服务器变卡怎么排查 1、网络2、cpu的利用率3、io效率4、内存瓶颈 1、网络 可以使用netstat、iftop等工具查看网络流量和网络连接情况,检查是否网络堵塞、丢包等问题 2、cpu的利用率 1、用top命令定…

VMWare Ubuntu压缩虚拟磁盘

VMWare中ubuntu会越用越大,直到占满预分配的空间 即使系统里没有那么多东西 命令清理 开机->open Terminal sudo vmware-toolbox-cmd disk shrink /关机-> 编辑虚拟机设置->硬盘->碎片整理&压缩 磁盘应用 开机->disk usage analyzer(应用) …

【LLM】认识LLM

文章目录 1.LLM1.1 LLM简介1.2 LLM发展1.3 市面常见的LLM1.4 LLM涌现的能力 2.RAG2.1 RAG简介2.2 RAG 的工作流程2.3 RAG 和 Finetune 对比2.4 RAG的使用场景分析 3. LangChain3.1 LangChain简介3.2 LangChain的核心组件3.3 LangChain 入门 4.开发 RAG 应用的整体流程5. 环境配…

stm32中的中断优先级

在工作中使用到多个定时器中断,由于中断的中断优先级不熟悉导致出错,下面来写一下中断的一些注意事项。 一、中断的分类 1、EXTI外部中断:由外部设备或外部信号引发,例如按键按下、外部传感器信号变化等。外部中断用于响应外部事件,并及时处理相关任务。 2、内部中断:…

搭建Zookeeper完全分布式集群(CentOS 9 )

ZooKeeper是一个开源的分布式协调服务,它为分布式应用提供了高效且可靠的分布式协调服务,并且是分布式应用保证数据一致性的解决方案。该项目由雅虎公司创建,是Google Chubby的开源实现。 分布式应用可以基于ZooKeeper实现诸如数据发布/订阅…

Jmeter 测试-跨线程调用变量

1、Jmeter中线程运行规则 ①各个线程组是完全独立的,每个线程组是不同的业务,互不影响 ②线程组中的每个线程也是完全独立 ③线程组中的每个线程,都是从上往下执行,完成一轮循环后,继续下一轮循环 ④存在业务流或者…

考察自动化立体库应注意的几点

导语 大家好,我是智能仓储物流技术研习社的社长,老K。专注分享智能仓储物流技术、智能制造等内容。 整版PPT和更多学习资料,请球友到知识星球 【智能仓储物流技术研习社】自行下载 考察自动化立体仓库的关键因素: 仓库容量&#x…

python爬虫之爬取微博评论(4)

一、获取单页评论 随机选取一个微博,例如下面这个 【#出操死亡女生家属... - 冷暖视频的微博 - 微博 (weibo.com) 1、fnf12,然后点击网络,搜索评论内容,然后预览,就可以查看到网页内容里面还有评论内容 2、编写代码…

稀碎从零算法笔记Day51-LeetCode:最小路径和

题型:DP、数组、矩阵 链接:64. 最小路径和 - 力扣(LeetCode) 来源:LeetCode 题目描述 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为…

适用于Windows电脑的最佳数据恢复软件是哪些?10佳数据恢复软件

丢失我们系统中可用的宝贵信息是很烦人的。我们可以尝试几种手动方法来重新获取丢失的数据。然而,当我们采用非自动方法来恢复数据时,这是一项令人厌烦和乏味的工作。在这种情况下,我们可以尝试使用一些正版硬盘恢复软件进行数据恢复。此页面…

Dual-AMN论文阅读

Boosting the Speed of Entity Alignment 10: Dual Attention Matching Network with Normalized Hard Sample Mining 将实体对齐速度提高 10 倍:具有归一化硬样本挖掘的双重注意力匹配网络 ABSTRACT 寻找多源知识图谱(KG)中的等效实体是知识图谱集成的关键步骤&…
最新文章