【数据结构入门 】栈

news2024/9/22 1:02:45

目录

前言

一、栈的概念及结构

二、栈的实现

1. 栈的声明

2.初始化栈 

3. 栈的销毁

4.判断是否为空栈

 5.入栈(只能插入栈顶元素)

6. 出栈(只能从栈顶删除)

 7.栈的大小

8.获取栈顶元素

总结


前言

        在计算机科学中,栈(Stack)是一种常见的数据结构,它遵循“后进先出”(LIFO)原则。栈可以被看作是一种特殊的线性表,它只允许在表的一端进行插入和删除操作,这一端被称为栈顶。
栈的操作相对简单,只有两种基本操作:入栈(Push)和出栈(Pop)。入栈将一个元素放入栈顶,出栈将栈顶元素弹出,也就是从栈中删除一个元素。
        栈的应用非常广泛,特别是在计算机编程中。它常常作为一种临时存储空间来管理函数调用、表达式求值等操作。栈也常被用来处理递归算法、深度优先搜索、括号匹配等问题。
        通过构建一个栈,我们可以非常方便地实现后进先出的数据结构,使得我们能够高效地处理一些具有类似特性的问题。因此,了解和掌握栈的概念和操作是很重要的。在接下来的内容中,我们将详细介绍栈的基本原理、以及常见实现方式。希望通过本文的学习,读者能够深入理解栈,并能够在实际编程中熟练运用。

一、栈的概念及结构

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

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

        出栈:栈的删除操作叫做出栈。出数据也在栈顶

二、栈的实现

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

1. 栈的声明

typedef int STDataType;

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

记录栈顶和容量 

2.初始化栈 

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

	ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);
	if (ps->a == NULL)
	{
		perror("malloc fail");
		return;
	}

	ps->capacity = 4;
	ps->top = -1;//栈顶元素位置
}

top记录栈顶元素位置,或者下一位都可以,但是要注意之后的使用。

3. 栈的销毁

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

	free(ps->a);

	ps->a = NULL;
	ps->top = -1;
	ps->capacity = 0;
}

4.判断是否为空栈

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

	return (ps->top + 1) == 0;
}

 5.入栈(只能插入栈顶元素)

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

	if ((ps->top +1) == ps->capacity)
	{
		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * ps->capacity*2);
		if (tmp == NULL)
		{
			perror("malloc fail");
			return;
		}

		ps->a = tmp;
		ps->capacity *= 2;
	}

	ps->a[ps->top + 1] = x;

	ps->top++;
} 

这里在判断容量够不够时只在入栈时使用,所以可以不用封装函数;

在容量不够时需要扩容。

6. 出栈(只能从栈顶删除)

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

	ps->top--;
}

 7.栈的大小

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

	return ps->top + 1;
}

8.获取栈顶元素

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

	return ps->a[ps->top];
}

总结

        在了解了栈如何实现后,还需要多做相关题目才可以理解栈的用法,可以在网上多找一些题目练练手哟!

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

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

相关文章

黑马Java零基础视频教程精华部分_10_面向对象进阶(2)

系列文章目录 文章目录 系列文章目录一、多态1、什么是多态?2、多态的表现形式3、多态的前提4、多态的好处5、多态调用成员的特点6、多态的优势和弊端7、引用数据类型的类型转换 二、包1、什么是包?2、包名的规则3、使用其他类的规则 三、final 最终的&a…

文件包含漏洞Tomato靶机渗透_详解

一、导入靶机 将下载好的靶机拖入到VMware中,填写靶机机名称(随便起一个)和路径 虚拟机设置里修改网络状态为NAT模式 二、信息收集 1、主机发现 用御剑扫描工具扫描虚拟机的NAT网段,发现靶机的IP是192.168.204.141 2、端口扫描 用御剑端口扫描扫描全…

完全免费的 TTS 文字转语音来了!

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 完全免费的 TTS 文字转语音来了! 再也不用被国内外各种语音合成割韭菜了。 试了下,确实是不限次数,不限语种,完全免费.输出视频如下: 效果就…

springboot干部考核系统-计算机毕业设计源码74229

摘要 随着我国社会经济的快速发展,对干部队伍的素质要求越来越高,如何科学、公正、准确地评价干部的工作绩效,激励干部发挥出更大的工作潜能,成为了当务之急。近年来,计算机技术和网络技术的飞速发展,为干部…

Minetest大师:1.0.21版本发布

下载Minetest大师v1.0.21 1、简介 Minetest大师,一款致力于Minetest的游戏盒子 可加Q群-:123117246,了解或获取最新版本 2、增加了大量的基础功能 资源中心与ContentDB同步,增加资源搜索、安装功能 增加在线服务器列表&#…

Python 爬虫入门(五):使用 lxml 解析网页

Python 爬虫入门(五):使用 lxml 解析网页 前言1. lxml 简介1.1 什么是 lxml?1.2 为什么选择 lxml?1.3 安装 lxml 2. lxml 基础2.1 解析 HTML/XML2.2 XPath 表达式2.3 使用 XPath 提取数据 3. 深入解析3.1 处理命名空间…

HarmonyOS应用开发者高级认证题目(7月新版,答案解析,持续更新)

HarmonyOS应用开发者高级认证题目(7月新版,答案&解析,持续更新) 单选 1.ArkTS支持以下哪些函数 A.Object.getOwnPropertySymbols(); B.Object.isExtensible(); C.Object.isPrototypeOf(); D.Object.keys(); 答案&#xff1…

《数据结构》(C语言版)第1章 绪论(下)

第1章 绪论 1.3 抽象数据类型的表示与实现1.4 算法与算法分析 1.3 抽象数据类型的表示与实现 数据类型 数据类型是一组性质相同的值的集合, 以及定义于这个集合上的一组运算的总称。 抽象数据类型(ADTs: Abstract Data Types) 更高层次的数据抽象。由用户定义,用…

反贿赂体系认证:企业诚信经营的护航者

在当今商业环境中,企业不仅要追求经济效益,更要坚守诚信经营的原则。反贿赂体系认证作为现代企业合规管理的重要手段,不仅提升了企业的道德形象,还为其市场竞争力注入了强劲动力。以下是反贿赂体系认证对企业的多方面益处。 首先&…

SpringBoot集成RocketMQ消息队列

RocketMQ简介 RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发,RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域&#xff0c…

AUTOSAR实战教程-最通俗的讲标定协议XCP初入门

XCP是什么 XCP是什么?我们开发过程中是不是经常用串口打印出一些变量的值供自己发现问题? XCP的作用1 跟上述串口看数据类似,只不过用一组更为严格的格式规定基于CAN/ETH/FLR进行数据的观测。 XCP作用2 比串口打印数据更强大的是,XCP可以通过变量地址对变量值进行改写!…

使用 Stripe 订阅和 Firestore 集成构建大型 Streamlit 应用程序

将创意转化为软件产品的能力是一项值得学习的技能。在这篇博客中,我将描述需要做些什么,以及如何将各个部分组合在一起以创建一款无需启动成本但具有订阅模式和 Firestore 集成的软件产品。 欢迎来到雲闪世界。 无论您是数据科学家、数据工程师还是从事其…

EasyAR_稠密空间图

EasyAR稠密空间图 1.稠密空间图 EasyAR稠密空间地图利用RGB相机图像对周围环境进行三维稠密重建,得到稠密的点云地图和网格地图。利用稠密空间地图让虚拟物体更好的融入真实环境之中,用以实现真实物体和虚拟物体正确遮挡、碰撞等AR应用。 2.在Unity中的…

深度学习入门——卷积神经网络

本章的主题是卷积神经网络(Convolutional Neural Network,CNN)。CNN被用于图像识别、语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎都以CNN为基础。本章将详细介绍CNN的结构,并用Python实…

从 Pandas 到 Polars 三十九:Polars 和 Matplotlib

Polars 与 matplotlib 配合得很好。 在matplotlib中,你可以直接使用polars的数据进行绘制图形,而无需把polars的dataframe转为pandas的dataframe: import polars as pl import matplotlib.pyplot as plt# 创建一个polars DataFrame df_pl …

5 道互联网大厂面试遇到的场景题

1.外卖单子只能被一个骑手接单 这是一个典型的分布式锁问题。可以采用以下几种方案: 基于Redis的分布式锁: 使用Redis的SETNX命令尝试获取锁设置合理的锁超时时间,防止死锁使用Lua脚本保证原子性操作考虑Redis集群环境下的一致性问题 基于Zookeeper的分布式锁: 创建临时顺…

openEuler系统合并home分区到root分区

为了支持国产系统底座,不受美帝卡脖子,加入openEuler,想把业务全部移植到openEuler系统上。在使用默认安装的情况下,会把home分区单独分配一个出来,为了方便,还是想合并到/根目录上。怎么做呢?发…

2023年码蹄杯专科组第三场初赛 解题报告 | 珂学家

前言 题解 这是2023年第三场码蹄杯职业院校算法比赛,3D眩晕(字符串hash)挺有意思的。 这个系列赛,喜欢出典题。 3D眩晕 难度: 钻石 思路: 字符串hash 这题难在容错性上,就是允许有x次修改( x ≤ 3 x \le 3 x≤3)&…

NICE Seminar(2023-07-16)|演化算法的理论研究到底有什么用?(南京大学钱超教授)

模式定理(Schema Theorem) 模式定理(Schema Theorem)是遗传算法(Genetic Algorithm, GA)的重要理论基础,由约翰霍兰德(John Holland)在1975年提出。它描述了具有特定模式…

【机器学习】回归类算法-相关性分析

一、前言 前面的几篇博客我们学习了分类算法,今天我们来了解一下回归类的算法吧。首先我们来谈谈两者有什么区别,首先是我们在之前的分类算法,这类算法可以将让我们学会如何将不同的数据划分到不同的类里面,输出的是一些离散的值。…