栈|数据结构

从工艺文件到寄生分析:手把手教你用华大九天RCExplorer做版图预检(附ITF文件解析) 本文详细介绍了华大九天RCExplorer工具在模拟IC和版图设计中的应用,从工艺文件解析到寄生参数提取的全流程。通过ITF文件的深度解析和实战案例,帮助工程师掌握金属层、介质层及通孔参数的关键影响,提升设计效率与准确性。文章还提供了与StarRC工作流集成的实用技巧,是国产EDA工具应用的权威指南。 阅读详情

栈

概念

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
在这里插入图片描述

在这里插入图片描述

结构设计

结构也可以使用链表结构,还有顺序表结构。链表结构实现在栈顶取决上,可以考虑链表结构的头删头插优势。链表头删头插相较于顺序表在时间上效率高链表就是链表头部插入删除O(1),但是数据存储空间不连续。顺序表在尾插时间复杂度O(1),但是数据存储在物理空间上是连续的。栈在实现栈可以选择较为连续空间作为栈结构。实现时就最优解。
在这里插入图片描述
对于栈比较常用接口初始化、压栈、出栈、销毁……

栈实现

结构定义

typedef int STDataType;
typedef struct Stack
{
	STDataType* _a;
	int _top; // 栈顶
	int _capacity; // 容量
}Stack;

这里实现结构定义虽然和顺序表大同小异,但是实现功能各有千秋。对于栈初始化理解是,如果使用结构体定义就可以在初始化时少开辟一个空间(结构体)。只需要开辟空间数组空间大小。在释放空间时可以少调用一次释放函数。

void StackInit(Stack* ps)
{
	STDataType* new = (STDataType*)malloc(10*sizeof(STDataType));
	if (new == NULL)
	{
		perror("malloc fail");
	}
	ps->_a = new;
	ps->_capacity = 10;
	ps->_top = 0;//相当于顺序表size。有效个数
}

在初始化时比较坑就是对于top赋值时。如果直接赋值0.就是栈顶元素下标的下一个。而赋值为-1.就是栈顶元素的下标。
其余接口函数实现时

// 销毁栈
void StackDestroy(Stack* ps)
{
	assert(ps);
	free(ps->_a);
	ps->_a = NULL;
	ps->_capacity = ps->_top = 0;
}



// 入栈
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	if (ps->_top == ps->_capacity)
	{
		STDataType* tmp = (STDataType*)realloc(ps->_a, sizeof(STDataType) * 2 * ps->_capacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
		}
		ps->_a = tmp;
		ps->_capacity *= 2;
	}
	ps->_a[ps->_top] = data;//数据入栈
	ps->_top++;
}

// 出栈
void StackPop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);

	ps->_a[ps->_top--];
	/*ps->_top--;*/
}
// 获取栈顶元素
STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);

	return ps->_a[ps->_top - 1];
}
// 获取栈中有效元素个数
int StackSize(Stack* ps)
{
	assert(ps);

	return ps->_top;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps)
{
	assert(ps);
	if (ps->_a == NULL)
	{
		return 1;
	}
	return 0;
}

小试牛刀

括号匹配
在这里插入图片描述
这里可以使用栈特性LIFO左括号压栈,右括号出栈栈顶元素。

typedef char STDataType;
typedef struct Stack
{
	STDataType* _a;
	int _top; // 栈顶
	int _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps);
// 入栈
void StackPush(Stack* ps, STDataType data);
// 出栈
void StackPop(Stack* ps);
// 获取栈顶元素
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
bool StackEmpty(Stack* ps);
// 销毁栈
void StackDestroy(Stack* ps);


// 初始化栈
void StackInit(Stack* ps)
{
	STDataType* new = (STDataType*)malloc(10*sizeof(STDataType));
	if (new == NULL)
	{
		perror("malloc fail");
	}
	ps->_a = new;
	ps->_capacity = 10;
	ps->_top = 0;//相当于顺序表size。有效个数
}

// 销毁栈
void StackDestroy(Stack* ps)
{
	assert(ps);
	free(ps->_a);
	ps->_a = NULL;
	ps->_capacity = ps->_top = 0;
}



// 入栈
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	if (ps->_top == ps->_capacity)
	{
		STDataType* tmp = (STDataType*)realloc(ps->_a, sizeof(STDataType) * 2 * ps->_capacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
		}
		ps->_a = tmp;
		ps->_capacity *= 2;
	}
	ps->_a[ps->_top] = data;//数据入栈
	ps->_top++;
}

// 出栈
void StackPop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);

	ps->_a[ps->_top--];
	/*ps->_top--;*/
}
// 获取栈顶元素
STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);

	return ps->_a[ps->_top - 1];
}
// 获取栈中有效元素个数
int StackSize(Stack* ps)
{
	assert(ps);

	return ps->_top;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
bool StackEmpty(Stack* ps)
{
	assert(ps);
	
	return ps->_top==0;
}


bool isValid(char * s){
    Stack st;
    StackInit(&st);
    while(*s)
    {
        if(*s=='('||*s=='{'||*s=='[')
        {
            StackPush(&st,*s);
            s++;
        }
        else
        {//没有左括号
            if(StackEmpty(&st))
            {
                return false;
            }
            int top=StackTop(&st);
            StackPop(&st);
			//不匹配
            if((top=='['&&*s!=']')||(top=='{'&&*s!='}')||(top=='('&&*s!=')'))
			{
				return false;
			}
			//匹配,继续
			else{
				s++;
			}
        }
    }
    int ret=StackEmpty(&st);
    StackDestroy(&st);
    return ret;
}
决策树(分类树、回归树) 决策树 前言:第一篇博客,最近看完决策树,想着归纳一下,也方便自己以后回顾。写的会比较全面一些,可能会有很多不太正确的地方,欢迎大家交流指正 : ) 决策树模型: 决策树模型是运用于分类以及回归的一种树结构。决策树由节点和有向边组成,一般一棵决策树包含一个根节点、若干内部节点和若干叶节点。决策树的决策过程需要从决策树的根节点开始,待测数据与决策树中的特征节点进行比较,并按照比较结果选... 阅读详情

相关推荐

【NAS系统】DSM7.2部署SVN服务

早期的群晖版本可以在套件中心找到SVN Server直接安装,然后配置仓库和用户。但‌2提到DSM7.0之后套件中心没有SVN了,得用Docker。

qq_38350004的博客 4847

数据结构——栈

栈(Stack)是只允许在一端进行插入或删除操作的线性表。栈顶(Top)。线性表进行插入删除的那一端。栈底(Bottom)。不允许进行插入和删除的另一端。空栈。不含任何元素的空表。

Smooth的博客 1142

TruckSim与Simulink联合仿真中的车轮转角精确控制策略

本文深入探讨了TruckSim与Simulink联合仿真中实现车轮转角精确控制的关键策略。针对多轴车辆路径跟踪时转角指令失灵的常见问题,核心在于正确配置TruckSim转向轴的外部输入模式(Advanced Settings),并确保仿真接口的稳定搭建。文章详细解析了从单轴到多轴协同转向的配置方法,并提供了提升MPC路径跟踪精度的实战技巧与调试经验。

weixin_29035147的博客 367

【数据结构】栈---超详解

/数组栈//定义类型int top;}Stack;栈由顺序表实现,因此需要一个数组,而栈有容量大小以及需要获取栈顶数据,所以需要同时管理多种不同类型数据,进而用一个结构体进行管理刚刚好。typedef将数据类型int以及结构体进行了重定义,以便于后续书写及修改。

2201_75806908的博客 249

深度学习-算法工程师岗位面试常见问题及解答

一、相关的问题 深度学习优化学习方法(一阶、二阶) 一阶方法:随机梯度下降(SGD)、动量(Momentum)、牛顿动量法(Nesterov动量)、AdaGrad(自适应梯度)、RMSProp(均方差传播)、Adam、Nadam。 二阶方法:牛顿法、拟牛顿法、共轭梯度法(CG)、BFGS、L-BFGS。 自适应优化算法有哪些?(Adagrad(累积梯度平方)、RMSProp(累积梯度平方的滑动平均)、Adam(带动量的RMSProp,即同时使用梯度的一、二阶矩))。 梯度下降陷入局部最优有什么解决

nobles007820的博客 2924

南邮-软件设计实验(C++版)

南邮软件设计 A档 一、分数统计 课题内容:   设计一个分数统计程序。包括学生信息的输入输出以及排序。通过该课题全面熟悉数组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。 课题要求: (1)输入某班级学生的姓名、分数; (2)对(1)的分数进行降幂排列并输出; (3)具有输入输出界面。 示例代码: #include<bits/stdc++.h> using...

Dainelcw 1万+

数据结构之栈详解

目录 栈 栈的应用 栈的实现 栈的时间复杂度 栈的应用 使用栈解决有效的括号问题(LeetCode第二十号问题) 栈 栈也是一种数据结构 相比数组,栈对应的操作是数组的子集 只能从一端添加元素,也只能从一端取出元素 这一端称为栈顶 栈是一种后进先出的数据结构 Last In First Out(LIFO) 在计算机的世界里,栈拥有着不可思议的作用 栈的应用 ...

万物并作,吾以观复 646

Fluent温度超限调试:从能量方程到网格优化的实战指南

本文深入解析Fluent中温度超限问题的诊断与解决方法,从能量方程机制到网格优化策略,提供实战指南。通过分析温度与焓的换算关系,探讨典型场景如能量方程发散、局部网格质量差等,并给出五步调试法及高级命令应用,帮助工程师有效解决温度计算异常问题。

weixin_29045585的博客 530

【数据结构】栈(详解)

数据结构中的栈(Stack)是一种特殊的线性表,其特殊性在于它只能在一端进行插入和删除操作,这一端被称为栈顶,另一端则被称为栈底。栈遵循“后进先出”(Last In First Out,LIFO)的原则,即最后一个被放入栈中的元素总是第一个被取出。 在编程中,栈常用于实现函数调用、表达式求值、数制转换、迷宫求解等算法。例如,在函数调用中,每调用一个函数,就将该函数的局部变量和返回地址压入调用栈中,当函数返回时,再从调用栈中弹出相应的数据。这种机制确保了函数调用的正确性和顺序性。

2201_75425839的博客 2168

ArcGIS属性表汉字转拼音

接着我安装了一个编辑器“PyCharm Community Edition 2019.3.3\bin\pycharm64.exe”,在里面添加“pypinyin”包,然后将其设置为arcgis的编辑器和调试程序,还是失败;我在10.6的机器上折腾了上面几步,直到两周后脚本突然运行成功,我也不确定是哪一步导致pypinyin包配置成功,因此将心得体会写出来,如果过一段时间,打开10.2的机器运行脚本成功了,再写后续.......,按照“配置方法1:”进行尝试,显示配置失败。

2301_77413856的博客 1294

海洋浮游生物识海洋浮游生物识别系统:基于YOLOv10的显微图像自动检测与UI别系统:基于海洋浮游生物识别系统:基于YOLOv10的显微图像自动检测与UI展示YOLOv10的显微图像自动检测与UI展示

本文介绍了如何利用YOLOv10模型进行海洋浮游生物的自动识别,旨在提高传统显微镜观测的效率与准确性。研究背景强调了浮游生物在海洋生态系统中的重要性,并指出传统方法的局限性。数据集选用WHOI-Plankton,包含70多种浮游生物的20000多张带标签图像。文章详细描述了YOLOv10模型的安装、数据集配置、训练与测试步骤,并提供了基于PyQt5的图形化检测界面代码。结果显示,模型在精度、召回率和mAP@0.5等指标上表现优异,推理速度达到约30 FPS。最后,文章提出了部署建议和未来优化方向,如集成摄像

YOLO 375

数据结构的栈和堆的区别

//转自:http://www.linuxidc.com/Linux/2016-05/131799.htm //注:黄颜色部分由笔者注释,不对望纠正,谢谢!     在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。 堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这

过路人 646

使用 Simulink 进行电力电子系统的效率优化仿真

电力电子系统(Power Electronics System)是现代电力系统和工业自动化中的关键组成部分,广泛应用于可再生能源发电、电动汽车、不间断电源(UPS)、电机驱动等领域。为了提高系统的整体性能和经济性,必须对电力电子系统的效率进行优化。效率优化的目标是最大化系统的能量转换效率,减少损耗,从而提高系统的可靠性和经济效益。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证电力电子系统的效率优化策略。本教程将详细介绍如何使用 Simulink 进行电力电子系统的效率优化仿真。

xiaoheshang_123的博客 355

数据结构之栈

栈是一种线性数据结构,它按照 “先进后出”(First In Last Out,FILO)的原则存储和操作数据。这意味着最后插入栈中的元素会最先被取出,就像一摞盘子,最后放上去的盘子会最先被拿走。

zzh_Zao的博客 1855

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数据结构 栈

摘要 栈是一种后进先出(LIFO)的线性数据结构,仅允许在栈顶进行插入(push)和删除(pop)操作。其核心特性包括:仅操作栈顶、不支持随机访问、默认基于deque实现。栈的提出源于1950年代鲍尔团队对逆波兰表达式计算和函数调用机制的研究,现广泛应用于程序调用栈、表达式求值、括号匹配等场景。C++中可通过STL的std::stack或手动数组实现栈操作,基本功能包括压栈、弹栈、判空等。例题B3758展示了栈在括号匹配中的典型应用——通过栈统计未匹配括号数量,动态补全成合法序列。栈的高效性使其成为算法和系

syshrgjdkdh的博客 2237

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

栈—数据结构

6、获取栈顶元素(获取栈顶元素,在外面开一个空间,将该空间的地址传过去,进行获取元素,以便于区分元素还是返回值)入栈的方向是是增栈的方式,放入数据的是满栈的方式。入栈的方向是是减栈的方式,放入数据的是满栈的方式。入栈的方向是是增栈的方式,放入数据的是空栈的方式。入栈的方向是是减栈的方式,放入数据的是空栈的方式。3、出栈(看一下,出去的元素,所以和6一样)1、入栈:先放入输入,再移动栈顶指针。2、出栈:先移动栈顶指针,再数据弹出。1、入栈:先挪栈顶指针,再放入数据。2、出栈:先移出数据,再移动指针。

weixin_63722559的博客 1427

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

数据结构——————栈

栈(Stack)是一种特殊的线性数据结构,其插入和删除操作都只允许在表的一端进行。这一端被称为栈顶(top),另一端则被称为栈底(bottom)。栈遵循后进先出(Last In First Out,LIFO)的规则,即最后存入的元素将被最先取出。顺序栈采用一个数组存放栈中的元素。如果需要用到两个类型相同的栈,这时若为它们各自开辟一个数组空间,极有可能出现这样的情况:第一个栈已满,再进栈就溢出了,而另一个栈还有很多空闲的存储空间。解决这个问题的方法是。

m0_66847953的博客 1381

【数据结构】栈

什么是栈?栈:一种特殊的线性表其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈顶 栈底是什么,线性表又是什么?栈顶与栈底是不固定的,取决于你想在哪边操作。拿顺序表举例,若只在表尾增删,那表尾就是栈顶,相对的表头就是栈底。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈,出数据也在栈顶。因为栈一般是存储在堆上的,故栈的大小可以看作无穷大(取决于你的机器)。【数据结构】初阶——顺序表①为什么说栈是受限制的。

Kaisir777的博客 878

【数据结构】栈和队列——栈

本文介绍了栈和队列的基本概念与实现方式。主要内容包括: 栈的定义与特点:受限线性表,遵循先进后出(FILO)原则,仅允许在栈顶进行插入(push)和删除(pop)操作。 栈的存储结构:顺序栈(数组实现)和链式栈(链表实现),分析各自优缺点。 顺序栈的实现细节:包括静态和动态两种方式,重点说明栈顶指针的两种不同定义方式及其操作差异。 栈的基本操作:详细讲解入栈(Push)操作的实现逻辑,包括栈满判断、元素放置和指针更新等关键步骤。 文章通过代码示例展示了顺序栈的初始化、入栈和出栈操作,并特别强调了动态顺序栈的

m0_72516377的博客 962

数据结构栈的理解

/ 支持动态增长的栈int _top;// 栈顶// 容量}Stack;// 初始化栈// 入栈// 出栈// 获取栈顶元素// 获取栈中有效元素个数// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0// 销毁栈栈的结构体中包含一个指针域,两个数据域,typedef: typedef是C语言中的一个关键字,用于为已存在的类型定义一个新的名称。在这个例子中,它用于为struct Stack这个结构体类型定义了一个别名Stack。

bw2810592402的博客 816
上一篇: 链表|数据结构
下一篇: 堆|数据结构
小鱼君
博客等级 码龄4年 530粉丝 33原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值