DS线性表之栈的讲解和实现(4)

news2024/11/23 15:34:50

文章目录

  • 前言
  • 一、栈的概念及结构
  • 二、关于实现栈的分析
    • 关于栈顶指针top
    • 关于结构体
    • 栈的初始化
    • 入栈
    • 出栈
    • 获取栈顶元素
    • 获取栈元素个数
    • 判断栈是否为空
    • 栈的销毁
  • 总结


前言

  栈就是一个比较实用的数据结构了,且大致逻辑就是套用之前的两种线性表

  具体选择哪种呢?请看正文!


一、栈的概念及结构

  栈是指一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则(与我们后面要学的队列先进先出的思想刚好相反)

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

栈有两种核心操作:压栈和入栈

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

在这里插入图片描述
在这里插入图片描述

所以我们可以发现,栈的入栈顺序只有一种,但是却可以有很多种出栈方式

题目:一个栈的入栈序列为ABCDE,则不可能的出栈序列为( )
A.ABCDE // 放一个拿一个
B.EDCBA // 全部放完后再连续拿五次
C.DCEBA
D.ECDBA
答案:D

二、关于实现栈的分析

  栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小,实现起来也更容易,且我们在顺序表那里也说过了静态表实用价值不大,于是我们这里采用动态顺序表来实现栈

关于栈顶指针top

请注意,虽然这里说top是栈顶“指针”,其实并不是一个真正的指针,而是一个下标,只是起到指向作用,故采取这一称呼

我们可以注意到,栈顶有两种定义方式:

  1. top为-1代表空,top为0代表一个元素
  2. top为0代表空,top指向下一个元素下标

其实两种都行,只是对于后面的插入数据即入栈时候的操作有所差别:
在这里插入图片描述

在这里我才用第二种方式,令top一开始为0,即让top指向下一个元素的下标

关于结构体

typedef int StackDataType;
typedef struct Stack
{
	StackDataType* a;
	int top;
	int capacity;
}ST;

栈的初始化

除了验空外还是一样的置空指针,且让栈顶指针指向第一个位置,容量也设为0

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

入栈

同前面一样,既然是往数组里塞东西,就必须要验证是否满栈
不一样的是,我们在这里验证是否满栈并没有单独封装成一个函数,这是因为我们只有在栈顶这一个地方进行入栈操作,其实就是尾插,因此不需要单独再实现一个函数
在这里插入图片描述

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没有给数值
}

出栈

注意栈顶指针是指向栈顶元素的下一个位置的下标,那我们不是将栈顶指针-1不就完成了出栈操作吗

其实就是尾删

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

获取栈顶元素

注意栈顶指针是栈顶元素的下一个位置的下标,所以我们要减一才能得到正确的数据,但是不能自减!因为这里并没有出栈的操作

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

获取栈元素个数

乐,其实还是看栈顶指针top,因为是指向下一个元素的下标,下标又是从0开始,两者一结合,那么top其实就是元素个数

int STSize(ST* pst)
{
	assert(pst);
	return pst->top;
}

判断栈是否为空

栈为空,就是大小是否为0,结合上一个函数,我们可以很自然而然的写出

bool STEmpty(ST* pst)
{
	assert(pst);
	return pst->top == 0;
}

栈的销毁

销毁,首先就是要回收Stack结构体里面的 STDataType* 指针所指向的内存并置空指针

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

总结

  栈是我们学习的第一个实用数据结构,且我们在未来的学习会经常遇到它,请好好体会它“后进先出”的思想,想想可能会有哪些具体实用场景

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

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

相关文章

综合布线研究实训室建设方案

1、 引言 随着信息技术的飞速发展,综合布线系统作为信息传输的基础设施,在各类建筑及信息化项目中发挥着越来越重要的作用。为了满足职业院校及企业对综合布线技术人才培养和研究的需求,本方案旨在建设一个集教学、实训、研究于一体的综合布…

ARM base instruction -- smull

有符号乘法运算 Signed Multiply Long multiplies two 32-bit register values, and writes the result to the 64-bit destination register. 将两个32位寄存器值相乘&#xff0c;并将结果写入64位目标寄存器。 64-bit variant SMULL <Xd>, <Wn>, <Wm>…

Linux破解root用户密码

在Linux启动菜单界面按【e】进入编辑启动菜单项 在LANGzh_CN.UTF-8&#xff08;或LANGen_US.UTF-8&#xff09;后面空出一格输入 rd.break consoletty0,再按【ctrlx】键启动Linux系统 以可读写的方式重新挂载文件系统 mount -o remount,rw /sysroot 改变根目录为/sysro…

Attention Is All You Need论文翻译

论文名称 注意力即是全部 论文地址 https://user.phil.hhu.de/~cwurm/wp-content/uploads/2020/01/7181-attention-is-all-you-need.pdf 摘要 主流的序列转导模型基于复杂的递归或卷积神经网络&#xff0c;这些网络包含编码器和解码器。性能最好的模型通过注意力机制将编码器和…

快速学习一个算法,Transformer模型架构

今天给大家分享一个超强的算法模型&#xff0c;Transformer Transformer 模型是目前自然语言处理&#xff08;NLP&#xff09;以及计算机视觉等领域中应用非常广泛的深度学习模型架构。 它由 Vaswani 等人在 2017 年的论文《Attention is All You Need》中提出&#xff0c;并…

【智能大数据分析 | 实验三】Storm实验:实时WordCountTopology

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…

并查集的实现(朴素版)

这是C算法基础-数据结构专栏的第二十九篇文章&#xff0c;专栏详情请见此处。 由于作者即将参加CSP&#xff0c;所以到比赛结束前将不再发表文章&#xff01; 引入 并查集是一种可以快速合并查找集合的一种数据结构&#xff0c;这次我们将通过三道题来详细讲解并查集&#xff…

迈普pnsr2900x DOWNLOAD_FILE 任意文件读取漏洞

0x01 产品描述&#xff1a; ‌ 迈普NSR2900X系列是一款专为军队、政府、金融、中小型企业分支机构和中小型企业总部设计的信创接入路由器。‌ 该路由器采用国产核心元器件&#xff0c;基于国产操作系统运行迈普自主研发的网络操作系统及应用软件。它全面支持IPv4、IPv6、OS…

insert into values 语句优化

insert into values插入单行数据 SQL语句&#xff0c;insert into values插入单行数据&#xff0c;执行10万次&#xff0c;执行时间1279秒&#xff0c;优化总体执行耗时。 SQL文本&#xff0c;单行insert values&#xff0c;没有select部分。需要进一步分析执行过程消耗。 ins…

软考《信息系统运行管理员》- 5.1 信息系统数据资源维护体系

5.1 信息系统数据资源维护体系 文章目录 5.1 信息系统数据资源维护体系数据资源维护的管理对象数据资源维护的管理类型运行监控故障响应数据备份归档检索数据优化 数据资源维护的管理内容维护方案例行管理应急响应数据资源的开发与利用 数据是信息系统管理的对象与结果&#xf…

7-基于国产化FT-M6678+JFM7K325T的6U CPCI信号处理卡

一、板卡概述 本板卡系我公司自主研发&#xff0c;基于6U CPCI的通用高性能信号处理平台。板卡采用一片国产8核DSP FT-C6678和一片国产FPGA JFM7K325T-2FFG900作为主处理器。为您提供了丰富的运算资源。如下图所示&#xff1a; 二、设计参考标准 ● PCIMG 2.0 R3.0 CompactP…

Python酷库之旅-第三方库Pandas(147)

目录 一、用法精讲 666、pandas.Timestamp.astimezone方法 666-1、语法 666-2、参数 666-3、功能 666-4、返回值 666-5、说明 666-6、用法 666-6-1、数据准备 666-6-2、代码示例 666-6-3、结果输出 667、pandas.Timestamp.ceil方法 667-1、语法 667-2、参数 667…

基础篇:带你打开Vue的大门(一)

学习目标&#xff1a; 理解Vue的基本概念&#xff1a;掌握Vue.js是什么&#xff0c;它的设计理念&#xff0c;以及它在现代Web开发中的应用。掌握Vue的基本语法&#xff1a;学习Vue的基础指令和语法&#xff0c;能够使用Vue构建简单的交互式界面。熟悉Vue组件化开发&#xff1…

DBA | 如何将 .bak 的数据库备份文件导入到SQL Server 数据库中?

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 原文链接&#xff1a;DBA | 如何将 .bak 的数据库备份文件导入到SQL Server 数据库中? 如何将&#xff08;.bak&#xff09;的SQL Server 数据库备份文件导入到当前数据库中? Step 1.登录到 Sql…

Centos7安装RocketMQ[图文教程]

文章目录 RocketMQ介绍基于Linux服务部署RocketMQ&#xff08;单机&#xff09;配置JDK环境下载RocketMQ部署RocketMQ1、解压2、修改VM参数3、配置环境变量4、编写Service文件5、启动服务 基于Docker方式部署RocketMQ安装Docker编写docker-compose文件启动RocketMQ服务 部署Roc…

前端学习-css的背景(十六)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 背景颜色 语法格式 背景图片 语法格式 背景平铺 语法格式 背景图片位置 语法格式 参数代表的意思 参数是方位名词 参数是精确单位 参数是混合单位 背…

架构设计笔记-11-未来信息综合技术

知识要点 云原生架构原则包括&#xff1a;服务化原则、弹性原则、可观测原则、韧性原则、所有过程自动化原则、零信任原则和架构持续演进原则。 区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构&#xff0c;并以密码学方式保证的不可篡改和不可…

【项目案例】-音乐播放器-Android前端实现-Java后端实现

精品专题&#xff1a; 01.C语言从不挂科到高绩点 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. SpringBoot详细教程 https://blog.csdn.ne…

项目管理系统如何助力新药研发?药物研发企业康诺亚上线瑞杰项目管理系统

在新药研发过程中&#xff0c;其特点是&#xff1a;周期长、风险高、投入大&#xff0c;同时还要与其他科学相结合&#xff0c;相互渗透、更加需要多部门的共同参与&#xff0c;因此面临的问题相对复杂&#xff0c;而且要求也比较高。所以在这一过程中&#xff0c;必须对新药研…

软考系统分析师知识点十一:系统规划

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间为&#xff1a;11月9日。 倒计时&#xff1a;26天。 目标&#xff1a;优先应试&#xff0c;其次学习&#xff0c;再次实践。 复习计划第一阶段&#xff1a;扫平基础知识点&#xff0c;仅抽取有用信息&am…