数据结构第四课 -----线性表之栈

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


  • **作者前言**
  • 栈的概念和结构
  • 栈的设计
    • 栈的创建和初始化
    • 栈的释放
    • 入栈
    • 出栈
    • 栈顶
    • 栈是否为空
    • 栈的长度
    • 第二种方法
  • 总结

栈的概念和结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除的一端称为栈顶,另一端称为栈底栈里的元素遵循后进先出的原则
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈,出数据也在栈顶
在这里插入图片描述
在这里插入图片描述
栈顶的位置是变化的,不是在某一个地方,栈顶是插入数据和删除数据的位置
如果我们要实现栈,有两种方法

  1. 数组栈
    在这里插入图片描述

使用数组来当作栈,栈底和栈顶的位置没有任何规定,但是我们一般是使用尾部为栈顶,头部为栈底,这样就可以减少数据的移动,空间不够就扩容,

  1. 链式栈
    在这里插入图片描述
    栈顶和栈底的位置随意,哪边都可以,而我们使用链表一般都是单链表
    在这里插入图片描述
    下面我就以数组栈来写一个栈

栈的设计

栈的创建和初始化

创建

typedef int TackDataType;
typedef struct SLtack
{TackDataType* TData;TackDataType Top;//标识栈顶位置int Capacity;
}SLtack;

初始化

void TackInit(SLtack* pst)
{assert(pst);pst->TData = NULL;pst->Top = 0;//栈顶元素的下一个pst->Capacity = 0;
}

这里的top的初始化有两种:
1.top 表示的是栈顶元素,我们要初始化为-1,
2.top表示栈顶元素的下一个 我们要初始化为0
原因:
在这里插入图片描述
假设我们初始化为0 且top是表示栈顶元素,就像上面这种情况,我们无法判断top为0时,栈是否还有元素,当我们表示top表示栈顶元素的下一个,top为0,栈就没有元素,或者我们top初始化为-1,top为栈顶元素,即使top为0,那栈还是有元素的

栈的释放

//释放
void TackDestroy(SLtack* pst)
{assert(pst);free(pst->TData);pst->TData = NULL;pst->Top = 0;pst->Capacity = 0;
}

入栈

void TackcapacityAdd(SLtack* pst)
{assert(pst);//扩容pst->Capacity = (pst->Capacity == 0 ? 4 : pst->Capacity * 2);TackDataType* tmp = realloc(pst->TData, sizeof(TackDataType) * pst->Capacity);if (tmp == NULL){perror("realloc");return;}pst->TData = tmp;}
//插入数据
void TackPushData(SLtack* pst, TackDataType elemest)
{assert(pst);//判断容量if (pst->Capacity == pst->Top){TackcapacityAdd(pst);printf("扩容成功\n");}assert(pst->Capacity != pst->Top);pst->TData[pst->Top] = elemest;pst->Top++;}

出栈

//删除数据
void TackPopData(SLtack* pst)
{assert(pst);if(pst->Top)pst->Top--;
}

栈顶

//找出栈顶
TackDataType* TackTop(SLtack* pst)
{assert(pst);return pst->TData + (pst->Top - 1);
}

栈是否为空

//判断栈是否为空
bool Empty(SLtack* pst)
{assert(pst);return pst->Top == 0;
}

栈的长度

//栈的长度
int TackSize(SLtack* pst)
{assert(pst);return pst->Top;
}

第二种方法

这种是把top初始化为-1

typedef char TackDataType;
typedef struct Stack
{TackDataType * a;int top; //栈顶元素int capacity;
}Stack;
//初始化
void TackInit(Stack *pst)
{assert(pst);pst->a = NULL;pst->top = -1;pst->capacity = 0;
}
// 入栈
void TackPush(Stack *pst, TackDataType elemest)
{assert(pst);//判断是否满了if ((pst->top) +1 == pst->capacity){pst->capacity = (pst->capacity == 0? 4 : pst->capacity * 2);TackDataType* tmp = (TackDataType*)realloc(pst->a,sizeof(Stack) * pst->capacity);if (tmp == NULL){perror("realloc");return;}pst->a = tmp;}pst->a[++(pst->top)] = elemest;}
//出栈
void TackPop(Stack *pst)
{assert(pst);if(pst->top != -1)pst->top--;
}
//长度
int TackSize(Stack *pst)
{assert(pst);return (pst->top) + 1;
}
//是否为空
bool TackEmpty(Stack *pst)
{assert(pst);return pst->top == -1; 
}
//栈顶元素
TackDataType TackTop(Stack *pst)
{assert(pst);return pst->a[pst->top];
}
//释放
void TackDestroy(Stack *pst)
{free(pst->a);pst->a = NULL;pst->top = -1;pst ->capacity = 0;
}

总结

栈的简单设计就到这里了,如果想要设置链式栈可以动手自己设计,后续会更新相关的代码

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

keepalived+haproxy配置集群和负载均衡

1、简介 1.1. Keepalived Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备…

旺店通·企业版对接打通金蝶云星空查询调拨单接口与分布式调入单新增接口

旺店通企业版对接打通金蝶云星空查询调拨单接口与分布式调入单新增接口 源系统:旺店通企业版 旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企业数字化…

通过ping来测试网络带宽

在windows下通过 ping -l 5000 192.168.31.1 其中5000为设置ping的单个包的大小 192.168.31.1为目的地地址 假设ping 5000字节平均耗费1ms而ping 45000字节平均耗费4ms,因此,往返额外花费3ms单程额外花费1.5ms,多发送40000字节即320000比特…

从0到0.01入门 Webpack| 002.精选 Webpack面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

数据结构 | 图

最小生成树算法 Prime算法 算法思路:从已选顶点所关联的未选边中找出权重最小的边,并且生成树不存在环。 其中,已选顶点是构成最小生成树的结点,未选边是不属于生成树中的边。 例子: 第一步: 假设我们从顶…

Webpack Bundle Analyzer包分析器

当我们需要分析打包文件dist里哪些资源可以进一步优化时,就可以使用包分析器插件webpack-bundle-analyzer。NPM上的介绍是使用交互式可缩放树图可视化 webpack 输出文件的大小。 我的是vue2项目。 1、webpack-bundle-analyzer插件的安装 $ npm install --save-dev…

linux中的工程管理工具makefile

makefile文件:Linux上的工程管理工具,可以实现自动化编译; 工程中的源文件不计其数,可以根据模块,功能等存储在不同的目录中; makefile可以提高编译效率,使用make命令每次只会编译那些修改了的或者依赖修改了的这些文件,没有修改的文件不会重新编译. VS底层就有自己的makefile文…

CRM系统对科技企业有哪些帮助

随着国家政策的倾斜和5G等相关基础技术的发展,中国人工智能产业在各方的共同推动下进入爆发式增长阶段,市场发展潜力巨大。CRM客户管理系统作为当下最热门的企业应用,同样市场前景广阔。那么,CRM系统对科技企业有哪些帮助&#xf…

千兆路由只有200M,原来是模式选择不对,也找到了内网不能通过动态域名访问内部服务的原因

本来1000M的宽带接入的,但是一测试发现只有200M,把电信叼了过来, 一测试发现宽带没问题,网线正常,网卡正常,只有可能是路由器的问题了,尴尬了,赶紧给满意好评放他走。回头好好研究一…

在qt的设计师界面没有QVTKOpenGLWidget这个类,只有QOpenGLWidget,那么我们如何得到QVTKOpenGLWidget呢?

文章目录 前言不过,时过境迁,QVTKOpenGLWidget用的越来越少,官方推荐使用qvtkopengnativewidget代替QVTKOpenGLWidget 前言 在qt的设计师界面没有QVTKOpenGLWidget这个类,只有QOpenGLWidget,我们要使用QVTKOpenGLWidget,那么我们如何得到QVTKOpenGLWidget呢? 不过,时过境迁,Q…

3.3 Linux 文件管理

1、查看系统信息 tty 命令 描述:查看当前系统在哪个终端语法:tty Linux默认情况下提供6个虚拟终端来让用户登录,系统将F1~F6定义为tty1~tty6。 ctrlalt(F1~F6) :从图形界面切换到命令行界面的第 n 个虚拟终端(F1 是…

MAT工具定位分析Java堆内存泄漏问题方法

原创/朱季谦 一、MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题。该工具提供了两种使用方式,一种是插件版,可以安装到Eclipse使用,另一种是独立版…