【初阶数据结构】深入解析栈:探索底层逻辑

news2024/11/18 11:32:39

在这里插入图片描述

🔥引言

本篇将深入解析栈:探索底层逻辑,理解底层是如何实现并了解该接口实现的优缺点,以便于我们在编写程序灵活地使用该数据结构。

请添加图片描述
Alt

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记
🌈初阶数据结构笔记专栏: 初阶数据结构笔记

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
请添加图片描述

文章目录

  • 一、栈的概念及结构
  • 二、关于实现栈的分析
  • 三、实现栈的相关接口(Satck.h)
    • 3.1 关于top的定义
    • 3.2 栈的初始化
    • 3.3 入栈操作
    • 3.4 出栈操作
    • 3.5 得到栈顶元素
    • 3.6 得到栈里面元素个数
    • 3.7 判断栈是否为空
    • 3.8 栈的打印
    • 3.9 栈的销毁

一、栈的概念及结构

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

这里主要分享的是跟数据结构相关的栈,而不是指存储内存一块内存区域栈区,栈区是指CPU寄存器里的某个指针所指向的一片内存区域(存放函数的参数值,局部变量的值等)

其中有两个核心操作压栈和出栈(出入数据在栈顶实现)

  • 压栈:栈的插入操作叫做进栈/压栈/入栈。入数据在栈顶

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

在这里插入图片描述

由于栈的特殊结构特性,所以出栈有多种方式,而入栈只有一种

2.一个栈的入栈序列为ABCDE,则不可能的出栈序列为( )
A.ABCDE
B.EDCBA
C.DCEBA
D.ECDBA
答案:D

二、关于实现栈的分析

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。在顺序表章节,说明了静态顺序表的实用价值不大,通常是使用动态,这里实现栈的也是是实现动态栈

在这里插入图片描述

三、实现栈的相关接口(Satck.h)

在这里插入图片描述

3.1 关于top的定义

在实现之前,对top需要有一个定义。当对栈顶元素修改的时候,top作为一个下标。既然top是一个下标,**那么top为0是代表栈为空还是栈存储一个元素,这个是需要我们去定义的(**在顺序表中,也是需要定义的)。所以栈有两种关于栈顶的定义。

  • top为-1代表空,top为0代表一个元素

  • top为0代表空,top指向下一个元素下标

其实上面的两种方式都可以的,在插入过程顺序会出现差异

在这里插入图片描述

下列的实现都是采用第二种top为0代表空,top指向下一个元素下标

3.2 栈的初始化

void STInit(ST *pst)
{
	assert(pst);//指向一个有效的结构体
	pst->a = NULL;
    pst->top =pst->capacity= 0;
}

3.3 入栈操作

void STPush(ST* pst, StackDataType x)
{
	assert(pst);
	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		StackDataType *tmp = (StackDataType*)realloc(pst->a, sizeof(StackDataType)*newcapacity);
		if (tmp==NULL)
		{
			perror("realloc fail!!!");
			return 1;
		}
		pst->capacity = newcapacity;
		pst->a = tmp;//保证安全返回
	}
	pst->a[pst->top] = x;//插入 
	pst->top++;//注意top的意义--之后里面为1没有给数值
}

这里需要注意的是:这里插入就是相当于顺序表的尾插,只有栈顶进行插入,所以没有必要单独实现扩容接口,直接在插入时需要空间进行扩容操作

3.4 出栈操作

void STPop(ST* pst)//跳出
{
	assert(pst);
	assert(pst->top > 0);//top为0,则是为空
	pst->top--;//元素个数--
}

这里需要注意的是:相当于顺序表的尾删,同时要满足保证有数据给你删除

在这里插入图片描述

3.5 得到栈顶元素

StackDataType STTOP(ST* pst)//得到栈顶元素
{
	assert(pst);
	return pst->a[pst->top-1];//这里减的话就会有问题
}

这里需要注意的是:这里top是指向下一个元素的下标,需要-1到达栈顶元素下标

3.6 得到栈里面元素个数

int STSize(ST* pst)
{
	return pst->top;//个数
}

3.7 判断栈是否为空

bool STEmpty(ST* pst)
{
	assert(pst);
	return pst->top == 0;//为0就是空,为真
}

3.8 栈的打印

void STPrintf(ST* pst)
{
	while(!STEmpty(pst))
	{
		printf("%d", STTOP(pst));
		STPop(pst);
		printf("\n");
	}
}

这里需要注意的是:打印是打印栈顶元素,为了下次打印,需要出栈得到新栈顶元素。当栈里面没有数据时,就不要再打印数据,没有数据打印。

3.9 栈的销毁

void STDestroy(ST* pst)//销毁
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->top =pst->capacity = 0;
}

请添加图片描述

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二初阶数据结构笔记,希望对你在学习初阶数据结构中有所帮助!

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

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

相关文章

Paimon Trino Presto的关系 分布式查询引擎

Paimon支持的引擎兼容性矩阵: Trino 是 Presto 同项目的不同版本,是原Faceboo Presto创始人团队核心开发和维护人员分离出来后开发和维护的分支,Trino基于Presto,目前 Trino 和 Presto 都仍在继续开发和维护。 Trino 生态系统-客…

YOLOv8改进 | SPPF | 具有多尺度带孔卷积层的ASPP【CVPR2018】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40篇内容,内含各种Head检测头、损失函数Loss、…

基于SSM+Jsp的校园餐厅管理

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

【C语言】函数执行背后的秘密:函数栈帧的创建和销毁超详解

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 目录 1. 什么是函数栈帧 2. 理解函数栈帧能解决什么问题呢? 3. 函数栈帧的创建和销毁解析 3.1 什么是栈? 3.2 认识相关寄存器和汇编指…

感恩父爱 健康同行 宁夏康源父亲节特惠普查

父亲,是那道坚实的屏障,为孩子们挡风遮雨。父亲,是那颗明亮的灯塔,为孩子们指明前进的方向。然而岁月无情,随着年龄的增长,曾经为我们遮风挡雨的父亲如今也逐渐进入了各种疾病的高发期。感恩父爱&#xff0…

selenium前期准备

1. 驱动地址: a. chromedriver:https://googlechromelabs.github.io/chrome-for-testing/ b. https://registry.npmmirror.com/binary.html?pathchromedriver/ 下载好的驱动一般放在Python初始文件夹下,例如:D:\Python3.8 2. selenium原理…

USB2.0学习4--USB包结构和包类型

目录 1. USB包基本结构 1.1 SOP域(Start Of Packet) 1.2 SYNC域(同步域) 1.3 PID域(标识域) 1.4 地址域(ADDR) 1.5 帧号域(Fram) 1.6 数据域&#xff…

医卫兰大药学试题及答案,分享几个实用搜题和学习工具 #经验分享#笔记#知识分享

随着信息技术的快速发展,搜题软件应运而生,为大学生提供了便捷的问题解答方式。 1.滑记 你可以选择一个学习类别,部分学习类别包括了多个学习卡包,每个学习卡包提供了简介和目录,每个学习卡包有多张学习卡片。 里面…

如何使用MATLAB写测试(4)重复劳动?TestMethodSetup!

如何使用MATLAB写测试(4)重复劳动?TestMethodSetup! 原文:如何使用MATLAB写测试(4)重复劳动?TestMethodSetup! - 知乎 (zhihu.com) 我们来自俄罗斯的实习生是学Compute…

SmartEDA引领教育革命:创新电路设计,点亮学生实践之路!

在数字化浪潮席卷全球的今天,教育领域的每一次创新都牵动着无数家长与学生的心。特别是在电路设计这一复杂而有趣的领域中,学生们往往因为缺乏实践机会和高效工具而感到迷茫。然而,随着SmartEDA的横空出世,这一切正在悄然发生改变…

通用大模型VS垂直大模型:你更青睐哪一方?

目录 引言 背景介绍 国内外垂直大模型的发展情况 国内外通用大模型的发展情况 哪一路径更为火热? 能力分析 通用大模型的独特能力 垂直大模型的独特能力 两者的差异与互补 难点探究 算力的挑战 数据的挑战 算法的挑战 结论 表格总结 引言 AI大模型的战…

前端开发接单公司做到哪些点,客户才愿意把项目包给你。

作为前端外包接单公司,你知道客户选择和你合作都看中哪些因素吗?单纯是价格吗?未必,本位给大家列举7个要素,并对每个要素做了定位,大家查缺补漏吧。 作为前端外包接单公司,要吸引同行客户将前端…

AI儿童绘本创作

之前分享过AI儿童绘画的项目,但是主要问题是角色一致要花费很长的时间! 今天发现了这款,非常奈斯! 只需输入故事主题、风格、模板,软件就会自动创作故事内容,自动生成插画配图,自动根据模板生…

29 哈希

目录 unordered系列关联式容器底层结构模拟实现 1. unordered系列关联式容器 在c98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 l o g 2 N log_2N log2​N,即最差情况下需要比较红黑树的高度次,当树中…

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据…

【云计算 复习】第5节 交互式分析工具Dremel(含大题)

一、概念 1.概述 (1)数据本身不会产生价值 只有经过分析才有可能产生价值。 (2)Google的Dremel是第一个在嵌套数据模型基础上实现列存储的系统。 (3)列存储有其便利之处,因为在不同列中相同位置…

windows-docker-本地部署-前端

前置条件 docker已有需要打包的文件也已经写好了 打包镜像 ip地址修改 需要根据自身修改的文件 .env.local文件存放你前端访问的端口 172.24.240.1:这部分是自己电脑的ip 如何查看本机ip,使用IPV4的地址。 #本地 #API_HOST_URLhttp://172.24.240.1:8091打包文…

在线装修管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,装修队管理,用户管理,装修管理,基础数据管理,论坛管理 前台账户功能包括:系统首页,个人中心,…

C语言中操作符详解(二)

OK,今天继续为诸君带来有关C语言中操作符的讲解 一 . 位操作符 C语言中的位操作符我相信大家并不陌生,我们在之前就已经接触过了一些 位操作符(位操作符的操作数只能是整数): (1)& &…

中国能源统计年鉴(1986-2023年)

数据年份:1986-2023年,无1987、1988、1990三年,1991-2023年齐 数据格式:pdf、excel 数据内容:《中国能源统计年鉴》是一部反映中国能源建设、生产、消费、供需平衡的权威性资料书。 共分为7个篇章:1.综合&a…