【严蔚敏版数据结构】你分得清顺序栈和链栈吗

news2024/10/7 18:21:24

【严蔚敏版数据结构】顺序栈和链栈的剖析和对比

      • 一、顺序栈和链栈的存储结构
      • 二、顺序栈和链栈的初始化
      • 三、顺序栈和链栈的判断是否栈空
      • 四、顺序栈和链栈的入栈
      • 五、顺序栈和链栈的弹栈
      • 六、顺序栈和链栈的取栈顶元素

一、顺序栈和链栈的存储结构

顺序栈的存储结构图如下:
在这里插入图片描述
由图可知,顺序栈是由两个指针,即栈顶top指针、栈底base指针来掌控大局的。同时,还有栈长度stacksize这个辅助。

因此,顺序栈的结构体定义如下:

type struct {
	// 栈顶top指针、栈底base指针
	SElemType *top;
	SElemType *base;
	
	// 栈长度stacksize
	int stacksize;
}SqStack;

明明已经有栈顶top指针、栈底base指针分别指着栈的栈底首元素和栈顶末元素了,为什么还需要栈长度stacksize呢?

因为只有根据栈长度stacksize,我们才能晓得整个顺序栈的总长度是多少,不至于出现上溢(栈满了,你特么还往里头塞新的元素)或下溢(栈空了,你还傻乎乎的想要继续弹出元素)的风险。

而,链栈的存储结构图如下:
在这里插入图片描述

看到没,链栈只有一个头指针S,而且这个头指针一直指向栈顶的元素。它就像监狱长,永远站在队伍的最末端,盯着最后一个新来的元素。

链栈每个节点都有两部分,一是存储数据的data部分,一是指向前一个元素的指针*next部分。

因此链栈的结构体定义如下:

// 定义结构体
typedef struct StackNode {
	// data部分和指针部分
	SElemType data;
	struct StackNode *next;
}StackNode, *LinkStack;

// 这个就是头指针大哥。
LinkStack S;

二、顺序栈和链栈的初始化

好,既然有了结构体,那么就可以初始化了。

顺序栈说白了,就是一个数组,既然是数组,就得在最开头分配内存空间了。(分配好内存后,栈底指针就不为空了)

由于新创建好的顺序栈,里头是没有任何一个元素的,因此,栈顶指针top和栈底指针base挨在一起腻歪。

与此同时,这个顺序栈的栈长度stacksize已经领下圣旨,获得了它的长度。

// 初始化
Status InitStack(SqStack &S) {
	// 分配内存 
	S.base = new SElemType[MAXSIZE];
	// 判断是否栈底为空,!S.base表示为空 
	if(!S.base) exit(OVERFLOW); 
	S.top = S.base;
	S.stacksize = MAXSIZE;
	return OK;
}

那么,链栈呢?

链栈是可以无止尽的新增新元素的,所以它的内存空间不能在一开始就确定好。(只能在每次一压栈(塞入新元素)时,才立刻给它安排个内存空间)

同样的,新创建好的链栈也是没有任何一个元素的,头指针大哥S只能百无聊赖的盯着一片虚无。

// 初始化
Status InitStack(LinkStack &S) {
	S = NULL;
	return OK; 
}

三、顺序栈和链栈的判断是否栈空

栈空,顾名思义,就是里面没有任何一个元素。

对于顺序栈来说,栈空,就意味着栈顶指针top和栈底指针base腻歪,

// 判断是否栈空
Status EmptyStack(SqStack S) {
	if(S.top == S.base)
		return TRUE;
	else
		return ERROR;
}

对于链栈来说,栈空,就意味着头指针大哥S百无聊赖的盯着一片虚无。

// 判断是否栈空
Status EmptyStack(LinkStack S) {
	if(S == NULL) 
		return TRUE;
	else 
		return FALSE;
}

四、顺序栈和链栈的入栈

梦里寻他千百度,蓦然回首,那元素却在灯火阑珊处。

很快,顺序栈迎来了它的一个新元素。

栈顶指针top骂骂咧咧,走到上一层的楼房,把原来待着的好位置让给了新来的。

如果栈顶指针不断上移,直到它站在了整层楼的楼顶(达到栈长度stacksize的值),这说明栈满了,无法再进来新元素。

// 入栈 
Status PushStack(SqStack &S, SElemType e) {
	// 判断是否栈满
	if(S.top - S.base == S.stacksize) 
		return ERROR;
	// 栈顶指针的内容更新为e,且往上增1 
	*S.top ++= e; 
	return OK; 
}

链栈的头指针大哥S也是迎来它的新元素。

刚刚就在初始化的时候讲过了,链栈在初始化时不会先分配内存给元素,因此这里就要分配内存了。

这里需注意,对于栈顶最末元素来说,S->data存储着是它,S->next指向的是它的前一个节点。

// 入栈
Status PushStack(LinkStack &S, SElemType e) {
	// 动态分配内存
	p = new StackNode;
	p->data = e;
	p->next = S;
	S = p;
	return OK; 
}

五、顺序栈和链栈的弹栈

虽然有新元素进来,可是它可能萌生了想离开的想法,那么就得弹栈,把它除去了。

对于顺序栈来说,弹栈之前先检查一下是否空栈,免得尴尬。

然后,栈顶指针top往下走一个楼层,最末一个新来的元素出栈。

// 弹出栈顶元素 
Status PopStack(SqStack &S, SElemType &e) {
	// 判断是否栈空
	if(S.top == S.base) return ERROR;
	// S.top下移,出栈元素被赋值给了e
	e = *--S.top;
	return OK; 
}

链栈在出栈之前,同样需要检查是否空栈。

临时一个节点代替头指针大哥S,等待头指针大哥S重新盯梢出栈元素的前一位元素之后,它就被删除了(释放内存)。

要出栈的元素从它所处节点的data部分被e带走了,头指针大哥S也重新盯梢出栈元素的前一位元素。

// 弹出栈顶元素 
Status PopStack(LinkStack &S, SElemType &e) {
	// 判断是否空栈
	if(S == NULL) return ERROR;
	p = S;
	e = S->data;	
	S = S->next;
	delete p;
	return OK; 
}

六、顺序栈和链栈的取栈顶元素

取栈顶元素之前,顺序栈和链栈同样都要检查是否空栈。

由于顺序栈的栈顶指针top永远站在栈顶元素的上一层,因此,要往下一层才能获得栈顶元素。

// 查询栈顶元素 
Status GetStackParm(SqStack S) {
	// 判断是否栈空
	if(S.top != S.base) 
		// 因为栈顶指针永远在栈顶元素的上一位,因此要返回(S.top - 1)指针所指的内容 
		return *(S.top - 1);	 
}

链栈的头指针大哥S最喜欢的就是盯梢了,因此,在不空栈的情况下,直接返回它的data部分即可获得栈顶元素。

// 查询栈顶元素 
Status GetStackParm(LinkStack S) {
	if(S!=NULL)
		return S->data;
}

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

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

相关文章

Windows 10系统,JDK安装与环境变量配置

引言 随着互联网的日益发展, 越来越多的小伙伴加入了程序员这个行列, 也有很多小伙伴正计划学习编程, 学习Java 那么对于新手来说, 第一件事就是下载安装Java开发工具包, 也就是JDK, 今天我们就来一起详细的说说怎么操作 JDK版本描述 学习环境中, 我们通常使用较新版本的JD…

支持PHP运行环境和系统防火墙配置管理,1Panel开源面板v1.1.0发布

2023年4月17日,现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.1.0版本。 在这一版本中,1Panel新增支持PHP运行环境、系统防火墙配置管理以及同步本地应用等功能,并带来了40多项功能更新和问题修复,感谢各位社区用户的反…

回归预测 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多输入单输出回归预测

回归预测 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多输入单输出回归预测 目录回归预测 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料效果一览 基本介绍 MATLAB实现GA-LSTM遗传算法优化长短期记忆网…

nvm管理node

开发的时候node版本不兼容问题频频出现,就得安装多个版本node,nvm管理起来就很方便。 首先nvm是一个nodejs的版本管理工具。为了解决node.js各种版本存在不兼容现象可以通过它安装和切换不同版本的node.js。 打开CMD,输入命令 nvm &#xf…

密码基础知识——密码的概念与作用

密码基础知识——密码的概念与作用密码的概念与作用密码的概念密码的重要作用密码的功能密码应用技术框架密码应用中的安全性问题密码应用安全性评估的基本原理信息安全管理标准PDCA 管理循环信息安全风险评估定义信息安全风险评估的目的和用途信息安全风险评估的基本要素密码的…

Centos 7 安装系列(10):ElasticSearch 8.6.2

ElasticSearch 部署一、系统环境二、解压安装2.1 解压压缩包2.2 修改配置文件2.3 添加操作用户2.4 启动2.5 开放端口2.6 开机自启动配置2.7 设置用户名密码认证三、总结一、系统环境 操作系统:Centos 7 已配置环境:空 二、解压安装 2.1 解压压缩包 上…

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析能力与项目科研水平

【原文链接】:基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土壤、农业、大气等领域的数据分析https://mp.weixin.qq.com/s?__bizMzU5NTkyMzcxNw&mid2247537467&idx4&sn10c4c12897282daf5320efae05caf3a4&chksmfe689551…

黑马2023JavaScript笔记1

一、js知识点 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-widt…

LoRA 指南之 LyCORIS 模型使用

LoRA 指南之 LyCORIS 模型使用 在C站看到这个模型&#xff0c;一眼就非常喜欢 在经历几番挣扎之后终于成功安装 接下来&#xff0c;我们一起开始安装使用吧&#xff01; 1、根据原作大佬的提示&#xff0c;需要安装两个插件 https://github.com/KohakuBlueleaf/a1111-sd-web…

蓝桥杯之我见

前言 关于蓝桥杯&#xff0c;应该有很多人不知道这是一个什么样的比赛。但是作为一名合格的程序员&#xff0c;就算之前没有参加过蓝桥杯的比赛&#xff0c;或者没听说过蓝桥杯&#xff0c;读完本篇文章再说不知道蓝桥杯&#xff0c;就有点不合适了吧&#xff1f;&#xff01;那…

网络作业6【计算机网络】

网络作业6【计算机网络】前言推荐网络作业6一. 单选题&#xff08;共11题&#xff0c;33分&#xff09;二. 多选题&#xff08;共2题&#xff0c;10分&#xff09;三. 判断题&#xff08;共1题&#xff0c;1分&#xff09;四. 阅读理解&#xff08;共1题&#xff0c;56分&#…

DY-30型电压继电器DY-36

DY-30系列电压继电器 DY-32电压继电器&#xff1b;DY-36电压继电器&#xff1b; DY-33电压继电器&#xff1b;DY-37电压继电器&#xff1b; DY-34电压继电器&#xff1b;DY-38电压继电器&#xff1b; DY-31电压继电器&#xff1b;DY-35电压继电器&#xff1b; DY-32/60C电压继…

npm与node版本不匹配问题解决思路(一百五十八)

1.报错 npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: ‘electron-packager17.1.1’, npm WARN EBADENGINE required: { node: ‘> 14.17.5’ }, npm WARN EBADENGINE current: { node: ‘v12.22.9’, npm: ‘8.5.1’ } npm WARN EBADENGINE } np…

软件测试【常见】62 道面试题,不背完这些你还想去面试?

01、您所熟悉的测试用例设计方法都有哪些&#xff1f;请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 02、您认为做好测试用例设计工作的关键是什么&#xff1f; 03、您在从事性能测试工作时&#xff0c;是否使用过一些测试工具&#xff1f;如果有&#xff0…

中国人民大学与加拿大女王大学金融硕士——去发现、去尝试更多的可能

现实中很多人都曾信心满满地列出各种计划&#xff0c;学习、减肥、运动等等&#xff0c;但结果却是“晚上想想千条路&#xff0c;早上醒来走原路”。三毛说过&#xff1a;“我有一个想法&#xff0c;去做&#xff01;”我们要发现&#xff0c;更要去行动&#xff0c;去尝试更多…

python输入矩阵的方法

在 python中输入矩阵有多种方法&#xff0c;这里我主要介绍下面几种。 输入矩阵的第一种方法&#xff0c;用 shell命令来实现。这个方法可以用来将矩阵转化为字符串&#xff0c;然后进行输入。 另外一种方法是使用 list语句。这个语句也是可以用来把矩阵转换为字符串的&#xf…

MongoDB的安装及配置 windows版本

1.去mongoDb官网下载后缀是.msi &#xff08;我安装的是6.0.0版本以下&#xff09; mongodb下载地址 2.接下来按照图示步骤安装即可 &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; &#xff08;4&#xff09;点击browse,这边要记住你的安装…

坚持60s(jar反编译)

下载附件打开&#xff0c;是一个.jar文件 好像是一个小游戏&#xff0c;但是我没明白怎么操作&#xff0c;我只知道它在侮辱我 .jar文件是java中的class文件打包而成的&#xff0c;相当于类库。 在打开.jar文件之前&#xff0c;要确保电脑里面安装好了java JDK(java 的开发环…

copilot使用教程

Copilot简介 Copilot是⼀种基于⼈⼯智能的代码⾃动补全⼯具&#xff0c;由OpenAI和GitHub共同开发。它使⽤⼈⼯智能算 法来分析代码库&#xff0c;并根据上下⽂和编程语⾔的语法提⽰&#xff0c;⾃动⽣成⾼质量的代码。⽬前&#xff0c;Copilot只能 与GitHub上的代码库集成&…

Visual studio创建C/c++静态库

参考文章&#xff1a; 1.visual studio 创建 C/C静态库和动态库 2.visual studio 2015创建静态库 3.Linux下C/C 编译生成.a 或者.so 库文件 4.Visual Studio创建并使用静态库(.lib) 可以结合链接1和链接4&#xff0c;链接4主要看图形&#xff0c;链接1看步骤&#xff0c;创建静…