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

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者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;
}

总结

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

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

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

相关文章

常见排序算法实现

💕"每一天都是值得被热爱的"💕 作者:Mylvzi 文章主要内容:常见排序算法实现 1.排序的概念 所谓排序,就是按照特定顺序重新排列序列的操作 排序的稳定性: 当一个序列中存在相同的元素时 排序过…

1、NPC 三电平SVPWM simulink仿真

1、SVPWM时间计算函数,是从matlab的SVPWM3L_TimingCalculation.p文件中反汇编出来的函数: function [TgABC_On ,TgABC_Off ,Sn ]SVPWM3L_TimingCalculation_frompfile (Vref ,DeltaVdc ,Fsw ) %#codegen %coder .allowpcode (plain ); TgABC_On [0 ,0 ,…

Genio 700安卓核心板-MT8390安卓核心板规格参数

Genio 700(MT8390)安卓核心板是一款专门针对智能家居、互动零售、工业和商业应用的高性能边缘人工智能物联网平台。它集成了高度响应的边缘处理、先进的多媒体功能、各种传感器和连接选项,并支持多任务操作系统。 )安卓核心板采用高效的芯片内人工智能多处理器(APU)…

计算机毕业设计 基于SpringBoot的销售项目流程化管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

Python+Qt多点最短路径(最优路径)算法实现

程序示例精选 PythonQt多点最短路径(最优路径)算法实现 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《PythonQt多点最短路径(最优路径)算法实现》编写代码,代码整洁&#xff0…

SDL2 播放视频文件(MP4)

1.简介 这里引入FFmpeg库,获取视频流数据,然后通过FFmpeg将视频流解码成YUV原始数据,再将YUV数据送入到SDL库中实现视频播放。 2.FFmpeg的操作流程 注册API:av_register_all()构建输入AVFormatContext上下文:avform…

vscode+python开发之虚拟环境和解释器切换

需求情景: 现在我们要开发多个项目比如:项目A,项目B、项目C,他们每个项目需要依赖不同的库。每个项目依赖的解释器也不一样怎么办? 项目A:需要在python3.7环境运行 依赖aadd3.2库 项目B、需要在python3.11…

取消Element UI响应式设计——打造固定布局的菜单

引言 在当今的Web开发中,响应式设计已经成为了一个不可或缺的部分。然而,有时候我们可能需要取消这种响应式特性,尤其是对于一些特定的界面元素,如导航菜单。在Element UI框架中,导航菜单(el-menu&#xff…

arcgis--填充面域空洞

方法一:使用【编辑器】-【合并工具】进行填充。首选需要在相同图层中构造一个填充空洞的面域,然后利用【合并】工具进行最后填充。 打开一幅含有空洞的矢量数据,如下: 打开【开始编辑】-【构造工具】-【面】进行覆盖空洞的面域的…

基于鸟群算法优化概率神经网络PNN的分类预测 - 附代码

基于鸟群算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于鸟群算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于鸟群优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…

机器视觉系统中工业光源选型避坑指南

光源的作用: 照亮目标,提高目标亮度 形成有利于图像处理的效果,提升对比度 克服环境光干扰,保证图像的稳定性 光源的选型思路: ①颜色 ②外形  ③打光方式  ④亮度 选颜色 通过选择合适颜色的光源,…

腾讯云CVM服务器5年可选2核4G和4核8G配置

腾讯云服务器网整理五年云服务器优惠活动 txyfwq.com/go/txy 配置可选2核4G和4核8G,公网带宽可选1M、3M或5M,系统盘为50G高性能云硬盘,标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器,…

Android JNI静态和动态注入方法

作者:MiniCode Android调用C/C的代码目前比较流行的方式之一便是通过JNI,其中按本地方法的实现有两种方式:静态和动态 创建一个C项目或者C的Module: 创建成功之后会生成如下文件(CMakeLists.txt、nativelib.cpp&#…

Centos7下mbr主引导记录演示

linux mbr主引导记录演示 dd if/dev/sda ofmbr.bin bs446 count1 dd if/dev/sda ofmbr.bin bs446 count1hexdump -C mbr.bin[rootlocalhost ~]# cd /boot/grub2 [rootlocalhost grub2]# ls [rootlocalhost grub2]# grub2-editenv list #默认引导内核查看 [rootlocalhost g…

生产环境中的面试问题,实时链路中的Kafka数据发现某字段值错误,怎么办?...

大家好呀,今天分享的是一个生产环境中遇到的问题。也是群友遇到的一个面试问题。 原问题是: 早晨8点之后发现kafka的record中某个字段的值出现了错误,现在已经10点了,需要对kafka进行数据订正,怎么样定位和解决这个问题…

降低城市内涝风险,万宾科技内涝积水监测仪的作用

频繁的内涝会削弱和损坏城市的关键基础设施,包括道路、桥梁和公用设施。城市内涝风险降低可以减少交通中断事件,也可以保护居民安全并降低路面维修等成本,进一步确保城市基本服务继续发挥作用。对城市可持续发展来讲有效减少内涝的风险是重要…

根据数组数组,实现上一页下一页功能

<span click"prePage"><i class"el-icon-back"></i></span><span click"nextPage"><i class"el-icon-right"></i></span> this.typeList&#xff1a;最终显示页面的数组 this.typeNe…

C#中.NET Framework4.8 Windows窗体应用通过EF访问数据库并对数据库追加、删除记录

目录 一、应用程序设计 二、应用程序源码 三、生成效果 前文作者发布了在.NET Framework4.8 控制台应用中通过EF访问已有数据库&#xff0c;事实上在.NET Framework4.8 Windows窗体应用中通过EF访问已有数据库也是一样的。操作方法基本一样&#xff0c;数据库EF模型和上下文…

MySQL时间戳2038年灾难:你的数据还能撑过去吗?

点击上方蓝字关注我 Timestamp 类型在MySQL中通常用于存储日期和时间。然而&#xff0c;Timestamp类型的一个限制是其存储范围&#xff0c;它使用4字节&#xff08;32位&#xff09;整数来表示秒数&#xff0c;从而导致在2038年01月19日03:14:07之后无法正确存储时间戳。这是因…

Android设计模式--工厂模式

一&#xff0c;定义 工厂模式与Android 设计模式--单例模式-CSDN博客&#xff0c;Android设计模式--Builder建造者模式-CSDN博客&#xff0c;Android设计模式--原型模式-CSDN博客 一样&#xff0c;都是创建型设计模式。 工厂模式就是定义一个用于创建对象的接口&#xff0c;让…