【数据结构】【版本1.3】【线性时代】——栈

news2024/10/6 4:02:37



快乐的流畅:个人主页


个人专栏:《算法神殿》《数据结构世界》《进击的C++》

远方有一堆篝火,在为久候之人燃烧!

文章目录

  • 引言
  • 一、栈的概念
  • 二、栈的模拟实现
    • 2.1 定义
    • 2.2 初始化
    • 2.3 销毁
    • 2.4 压栈
    • 2.5 判空
    • 2.6 出栈
    • 2.7 获取栈顶元素
    • 2.8 获取栈的元素个数
    • 2.9 元素访问
  • 三、栈的应用场景

引言

数据结构世界——栈(Stack)

一、栈的概念

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

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈。出数据也在栈顶

二、栈的模拟实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

2.1 定义

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;
  • 当前元素个数用栈顶top来表示,是栈独有的表示方法

2.2 初始化

void STInit(ST* pst)
{
	assert(pst);

	pst->a = NULL;
	pst->top = 0;//top指向栈顶元素的下一个位置
	pst->capacity = 0;
}
  • 栈的初始化,top可以为0或-1,top为0,则指向栈顶元素的下一个位置,top为-1,则指向栈顶元素的位置
  • 这里选用top为0,因为后面写的适合方便理解

2.3 销毁

void STDestroy(ST* pst)
{
	assert(pst);

	free(pst->a);
	pst->top = pst->capacity = 0;
}
  • 栈的销毁和顺序表一样,直接释放数组空间,将top和capacity置为0

2.4 压栈

void STPush(ST* pst, STDataType x)
{
	assert(pst);

	if (pst->top == pst->capacity)
	{
		int newCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(pst->a, newCapacity * sizeof(STDataType));

		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}

		pst->a = tmp;
		pst->capacity = newCapacity;
	}

	pst->a[pst->top++] = x;
}
  • 先判断是否需要扩容,因为这里只有压栈函数需要判断扩容,所以就不用专门再写一个扩容函数
  • 初始容量为4,后续每次进行2倍扩容(这样扩容比较合理,不会太频繁,也不会太浪费)
  • 再将元素压栈,top++

ps:realloc函数在pst为NULL时,充当malloc的作用,所以既可以为初始栈开辟空间,又可以扩容 。

2.5 判空

bool STEmpty(ST* pst)
{
	assert(pst);

	return pst->top == 0;
}
  • 如果top为0,则栈为空,返回真;反之,返回假

2.6 出栈

void STPop(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));

	pst->top--;
}
  • assert断言判断,栈是否为空,因为top不能减到负数
  • 再将top- -,掩盖栈顶元素

2.7 获取栈顶元素

STDataType STTop(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));

	return pst->a[pst->top - 1];
}
  • assert断言判断,栈是否为空,因为top不能减到负数
  • 再返回栈顶元素,因为这里top指向的是栈顶元素的下一位,所以下标访问时top要减1

2.8 获取栈的元素个数

int STSize(ST* pst)
{
	assert(pst);

	return pst->top;
}
  • top指向的是栈顶元素的下一位,所以数值上就是栈的元素个数

这里很多函数实现都很简单,有些操作直接外部对结构体都可以直接实现,但最后还是写成函数封装,因为top的含义有多重,防止别人使用时误解,导致使用错误 。

2.9 元素访问

栈中元素访问(打印),不是用函数实现。因为它的特殊结构,决定了它的元素不能从任意位置访问 ,必须符合后进先出原则才可以。

void TestStack1()
{
	ST st;
	//初始化
	STInit(&st);
	//压栈
	STPush(&st, 1);
	STPush(&st, 2);
	printf("%d\n", STTop(&st));
	STPop(&st);
	STPush(&st, 3);
	STPush(&st, 4);
	STPush(&st, 5);
	//打印
	while (!STEmpty(&st))
	{
		printf("%d\n", STTop(&st));
		STPop(&st);
	}
	//销毁
	STDestroy(&st);
}
  • 通常用循环的方式进行访问,同时每访问一个元素,就将它弹出栈,在进行下一个元素的访问

三、栈的应用场景

  1. 函数调用与返回
    在程序执行过程中,函数调用和返回是栈结构的一个典型应用。当函数被调用时,其返回地址、局部变量等信息被压入调用栈中;当函数返回时,这些信息从调用栈中弹出并恢复程序的执行状态。

  2. 浏览器的前进后退
    在浏览器中浏览网页时,我们使用的前进和后退功能也是栈结构的一个应用。浏览器将用户访问过的网页地址保存在一个栈中,当用户点击后退按钮时,浏览器从栈顶弹出最近访问的网页地址并跳转到该网页;当用户点击前进按钮时,浏览器将之前弹出的网页地址重新压入栈中并跳转到该网页。

  3. 表达式求值
    在编译器和解释器中,表达式求值也是栈结构的一个重要应用。编译器和解释器将表达式转换为逆波兰表示法(Reverse Polish Notation, RPN),并使用栈来存储和操作操作数和操作符,从而实现表达式的求值。


真诚点赞,手有余香

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一分钟生成论文全文,这款AI论文神器你不会还不知道吧?

毕业季写论文就选范文喵AI论文助手。范文喵V2.0主要包括了论文范文、选题分析、开题报告、任务书的写作、以及论文答辩PPT、论文解读等功能。此外,我们也会在近期进一步优化范文喵论文助手,写作效果更好的V3.0版本预计将于今年7月份和大家见面&#xff0…

Ps:动作面板

Ps菜单:窗口/动作 Window/Action 快捷键:Alt F9 动作面板 Action Panel提供了一种自动化的方法,可以记录、播放、编辑和管理一系列的 Photoshop 操作。使用动作可以大大提高工作效率,特别是在处理重复性任务时。 ◆ ◆ ◆ 常用…

WPF 深入理解二、布局

布局与控件 常用得布局属性 HorizontalAlignment:用于设置元素的水平位置VerticalAlignment: 用于设置元素的垂直位置Margin: 指定元素与容器的边距Height: 指定元素的高度Width: 指定元素的宽度WinHeight/winWidth:指定元素的最小高度和宽度MaxHeight/MaxWidth: 指定元素的最…

AD域离线破解新思路:Trustroasting和TimeRoasting

简介 近期Tom Tervoort发表了白皮书《TIMEROASTING, TRUSTROASTING AND COMPUTER SPRAYING》并在Github发布了名为Timeroast的工具包,其中介绍了几种新的攻击思路TimeRoasting、Trustroasting和计算机账户密码喷洒,本篇文章主要对TimeRoasting和Trustro…

主流电商平台API接口【京东商品详情按关键字搜索商品按图搜索京东商品(拍立淘)获得店铺的所有商品】

主流电商平台商品接口在电商企业中的应用可以帮助企业实现信息同步、库存管理、订单处理、数据分析和营销推广等多重功能,提升运营效率、优化用户体验,进而推动业务增长。 jd API 接入说明 API地址:申请调用KEY地址 调用示例: 参数说明 通用…

『大模型笔记』斯坦福大学教授李飞飞在2024年数据与人工智能峰会上的人工智能历史与未来

MAC 文章目录 一. 斯坦福大学教授李飞飞在2024年数据与人工智能峰会上的人工智能历史与未来引言过去与现在现代 AI 的进步未来的发展空间智能近期进展与未来展望文字输入制作视频机器人学习AI 与人类互动医疗健康应用结语二. 参考文献一. 斯坦福大学教授李飞飞在2024年数据与人…

保姆级网络信任证书配置教程

前言 TitanIDE在第一次安装完成以后,会显示的网络协议是https不安全的,我们需要在本地配置信任证书,有信任证书才能正常使用所有的功能,以下操作均以服务器名称ide,ip为192.168.101.144的服务器为例,在实际…

若依 Excel导入 字段值转换 字典自动匹配转换等

Excel表格数据截图: 数据库结构:需要将数据转换为数值或char类型存储 转换结果: 未使用Excel注解参数的效果: 断点数据 使用Excel注解参数的效果: 断点数据 最终入库: 参考: http://doc.ru…

一种改进最大相关峭度解卷积的滚动轴承故障诊断方法(MATLAB)

近年来,最大相关峭度解卷积受到了研究人员越来越多的关注,陆续有多篇研究论文将该方法应用于滚动轴轴承故障诊断。MCKD是由McDonald提出的一种解卷积方法,其算法中设计了一个新的目标函数——相关峭度,并以此为优化目标设计一系列…

软件测试——稳定性测试:adb Monkey

Monkey 1. Monkey1.1 Monkey 是什么1.2 Monkey 测试场景1.3 Monkey 特点1.4 Monkey 在哪里1.5 测试准备事项1.6 Monkey 参数列表 2. 基本命令3. 常用参数4. 事件类型5. 调试参数6. 日志管理7. 日志错误定位8. Monkey测试可以发现的问题 1. Monkey 1.1 Monkey 是什么 Monkey是一…

测量8个回路的三相多功能电表

随着工业的发展,在生产过程中,往往需要同时间测量多台设备的电流、电压和电量数据的采集,但是很多情况下,安装独立电表或者多用户计量箱,受限于安装空间大小无法实现。 下面我们举例说明,如图所示需要计量八个塑壳开关回路下设备的…

vue的安装配置并创建项目

npm 工具的安装 安装node.js之后,npm工具会自动安装到系统环境中 网址:https://nodejs.org/en vue的安装 安装vue并创建项目 npm create vuelatest 进入项目之后,然后启动npm run dev 解决方法: npm install -g create-vite 再次启动 通…

怎么为自己的VPS选择合适的CPU和RAM?

为网站选择VPS(虚拟专用服务器)与为家庭或办公室选择台式机或笔记本电脑没有什么不同。基本上,您要做的就是查看硬件配置并比较功能和价格。 然而,虽然您可能对个人计算机所需的资源类型有一个粗略的估计,但为服务器获…

企业PC端官网在线客服源码系统 完全开源可二开 附带源代码包+搭建部署教程

系统概述 企业 PC 端官网在线客服源码系统是一款专为企业打造的先进客服解决方案。它基于先进的技术架构,旨在为企业提供稳定、高效、功能丰富的在线客服服务。 该系统采用了模块化设计理念,将各个功能模块有机地整合在一起,形成了一个完整…

【Mybatis-plus】查询及更新为null或空字符串

前言 查询为 null 或者 空字符串时&#xff0c;可以使用 or() 关键字。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 查询 使用 LambdaQueryWrapper 查询 parentCode 为 null 或者 空字符串 的数据。 LambdaQueryWrapper<CompanyEntity> qu…

redhat-devtoolset备忘

参考&#xff1a; User Guide Red Hat Developer Toolset 12 | Red Hat Customer Portal https://access.redhat.com/documentation/en-us/red_hat_developer_toolset/12/html-single/user_guide/index Red Hat Devtoolset 是 Red Hat 提供的一组开发工具集合&#xff0c;主要用…

MySQL服务无法启动,服务没有报告任何错误(cmd里面)

安装压缩包版MySQL时&#xff0c;有时会此问题 解决方法 方法一、MySQL默认3306端口被占用&#xff0c;此时结束占用该端口的任务进程即可&#xff1b; 1.进入cmd,查找占用的端口 netstat -aon|findstr 3306 发现进程编号&#xff08;也就是PID)为2084的进程占用了此端口&am…

面试专区|【62道Redis高频题整理(附答案背诵版)】

什么是Redis? Redis是一个高性能的开源内存数据库系统&#xff0c;它使用键值对存储数据&#xff0c;并支持多种数据结构&#xff0c;如字符串、哈希、列表、集合和有序集合。与传统关系型数据库不同&#xff0c;Redis将数据存储在内存中&#xff0c;以实现快速读写操作。同时…

Chromium 开发指南2024 Mac篇-Chromium项目编译小技巧(六)

1. 前言 在编译大型项目如 Chromium 时&#xff0c;优化编译速度是非常重要的。本文将介绍一些编译优化的小技巧&#xff0c;尤其是如何使用 ccache 来加速 C/C 代码的重新编译。ccache 是一个编译器缓存&#xff0c;通过缓存之前的编译并检测何时再次进行相同的编译&#xff…

无引擎游戏开发(3):数据结构设计|功能函数完善

为了简单起见&#xff0c;我们将棋盘的二维数组定义为全局变量。除此之外还要定义一个char类型的全局变量来识别当前的落子类型&#xff0c;我们将其初始化为‘O’。 char Board_data[3][3] {{-, -, -},{-, -, -},{-, -, -}, };char Cur_piece O; 现在回到“读取操作”部分…