数据结构---栈的实现

news2024/11/24 18:39:16

文章目录

  • 前言
  • 一、什么是栈?
  • 二、栈的实现
    • 1.栈的结构
    • 2.栈的接口实现过程
  • 总结

前言

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。


一、什么是栈?

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。

进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。

栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。

二、栈的实现

1.栈的结构

//栈--用数组实现,后进先出
typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;//栈元素的下标
	int capacity;//栈元素的个数
}ST;

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

2.栈的接口

1.初始化

//初始化
void STInit(ST* pst)
{
	assert(pst);
	pst->a = (STDataType*)malloc(sizeof(STDataType) * 4);
	if (pst->a == NULL)
	{
		perror("malloc fail");
		return;
	}
	pst->capacity = 4;

	//top不同的初始化方式导致了不同的栈顶元素下标的表示
	//1.top初始化为0,则最终top代表栈顶元素的下一个位置的下标
	//2.top初始化为-1,则最终top代表栈顶元素的下标
	pst->top = 0;
}

2. 销毁

//销毁
void STDestroy(ST* pst)
{
	assert(pst);

	free(pst->a);
	pst->a = NULL;
	pst->top = pst->capacity = 0;

}

3. 插入--入栈

//扩容
void CheckCapacity(ST* pst)
{
	assert(pst);

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

//插入数据
void STPush(ST* pst, STDataType x)
{
	assert(pst);
	CheckCapacity(pst);
	pst->a[pst->top] = x;
	pst->top++;
}

插入数据,需要对数组容量进行判断,检测是否需要进行扩容

4. 删除--出栈

//判空
bool STEmpty(ST* pst)
{
	//空的话,返回true
	assert(pst);

	return pst->top == 0;
}


//删除
void STPop(ST* pst)
{
	assert(pst);
	//空的栈,不能删除
	assert(STEmpty(pst) != true);
	pst->top--;
}

删除一般配合判空使用,因为空的栈无法进行删除操作

5. 返回栈顶元素

//返回栈顶元素
STDataType STTop(ST* pst)
{
	assert(pst);
	//空的栈不能返回
	assert(STEmpty(pst) != true);
	STDataType ret = pst->a[pst->top - 1];
	return ret;
}

top不同的初始化方式导致了不同的栈顶元素下标的表示
1.top初始化为0,则最终top代表栈顶元素的下一个位置的下标
2.top初始化为-1,则最终top代表栈顶元素的下标

6.返回元素个数及打印

//返回元素个数
int STSize(ST* pst)
{
	assert(pst);
	//top初始化为0,则最终top代表栈顶元素的下一个位置的下标
	//同时,也代表前面的元素的个数
	return pst->top;
}

//打印
void Print(ST* pst)
{
	while (!STEmpty(pst))
	{
		printf("%d ", STTop(pst));
		STPop(pst);
	}
	printf("\n");

}

栈的性质,导致其无法进行普通的打印,需要利用其接口实现


总结

栈,数据结构的基本结构,它的特殊性质,导致其有着独特的使用场景,后进先出的方式,适用于各种情境,身为学习者的我们,需要充分了解其接口的实现,做到可以独立完成其复刻过程。

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

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

相关文章

用ChatGPT通过WebSocket开发一个交互性的五子棋微信小程序(二)

文章目录 1 前言1.1 实现的原理1.2 如何与微信小程序联系 2 五子棋项目2.1 申请OpenAI的API2.2 调用API代码2.3 界面代码 3 同步五子棋到前端小程序3.1 WebSocket长连接3.2 获取实时下棋 4 讨论 1 前言 1.1 实现的原理 大体方向是将ChatGPT作为后端语言模型,然后将…

AD19 基础应用技巧(差分线的添加走线与蛇形等长)

《差分线的添加走线与蛇形等长》 问:何为差分信号? 答:通俗地说,就是驱动端发送两个等值、反相的信号,接收端通过比较这两个电压的差值来判断逻辑状态“0”还是“1”。 问:差分线的优势在哪? 答:差分信号和普通的单端信号走线相比,最明量…

【SpringBoot2】三:基础入门---自动配置原理(自动配置原理入门+开发技巧)

文章目录 1.自动配置原理入门1.1 引导加载自动配置类1.2 按需开启自动配置项1.3 修改默认配置1.4 最佳实践 2.开发小技巧2.1 Lombok2.1.1 简化Bean开发2.1.2 简化日志开发 2.2 dev-tools2.3 Spring Initailizr(项目初始化向导) 1.自动配置原理入门 1.1 …

【数据库】Java的JDBC编程(idea链接数据库)

目录 前言 1、Java的数据库编程:JDBC 2、使用JDBC(项目中导入数据库驱动包) 2.1、获取驱动包 2.2、将数据库驱动包导入Java项目中 2.3、使用JDBC编写代码 2.3.1、创建并初始化一个数据源 2.3.2、 和数据库服务器建立链接 2.3.3、构…

C++(多态上)

目录: 1.多态的概念 2.多态的定义和实现 3.虚函数构成重写的特例 4.剖析一道非常经典的题 5.剖析多态的原理 ------------------------------------------------------------------------------------------------------------------------- 1.多态的概念 概念:通俗来说&#…

嵌入式开发--无刷电机学习2--克拉克变换

克拉克变换 首先说明,有很多方法,在数学上是等价的,比如33333*412。下面说的事情也是。 为了更简明的控制,克拉克女士提出电机控制简化的方法,即建立一个坐标系,横轴是α 纵轴是β,并将三相电…

RabbitMQ入门Demo 简单模式

出现的问题,原本4个操作,要么全部执行,要么全部不执行------->强一致性 但是现在分开了-----------最终一致性 强一致性:指在消息传递的过程中,系统会确保每个消息被精确地按照发送的顺序被传递,并且每个消息都会被正确地处理。强一致性…

重大问题,Windows11出现重大BUG

重大问题,Windows11出现重大BUG 这种Windows11操作系统出现BUG已经可以说是非常常见的,但是,今天我将代表所有微软用户,解决一个关于UI设计非常不舒服的功能 关闭多平面覆盖 事情叙述问题 微软社区解决方案自己发现的解决方案解决…

模拟比较器(Comparator)

概述 ⚫ 两个比较器,Comp1为低功耗比较器,Comp2为rail-to-rail快速比较器 ⚫比较器负端输入为vref或者IO输入,比较器正端为IO输入 ⚫ Buffer有Bypass功能,Bypass使能有效则不经过Buffer直接输入至比较器 ⚫ Buffer有1/2分压功能 ⚫…

JSON.stringfy() 和 qs.stringfy()区别 以及post/get 的参数形式

axios中post请求 application/json和 application/x-www-form-urlencoded 前端向后端传输数据时,如果是get传输,直接传在url后;如果是post传输,则在请求体body中传输。 在body中的数据格式又有两种,一种是 json 数据…

【Linux】教你用进程替换制作一个简单的Shell解释器

本章的代码可以访问这里获取。 由于程序代码是一体的,本章在分开讲解各部分的实现时,代码可能有些跳跃,建议在讲解各部分实现后看一下源代码方便理解程序。 制作一个简单的Shell解释器 一、观察Shell的运行状态二、简单的Shell解释器制作原理…

Python+Yolov8+Deepsort入口人流量统计

程序示例精选 PythonYolov8Deepsort入口人流量统计 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonYolov8Deepsort入口人流量统计>>编写代码&#xff0c;代码整洁&#x…

[java]云HIS运维运营分系统功能实现(springboot框架)

运维运营分系统 一级菜单包括&#xff1a;系统运维、综合监管、系统运营 系统运维包括二级菜单&#xff1a;环境管理、应用管理、菜单管理、接口管理、任务管理、配置管理 综合监管包括二级菜单&#xff1a;综合监管 系统运营包括二级菜单&#xff1a;机构管理、药品目录管…

计算机组成原理4.2.3提高存储器访问速度的措施

提高存储器访问层次大概有三种方法 采用高速器件 采用层次结构 Cache 主存 调整主存结构 调整存储结构 单体多字系统 利用程序局部性原理&#xff0c;访问一个块 相邻的若干块都会被拿出来&#xff0c;缺点可能会碰到跳转类指令 多体并行系统 高位是体号&#xff0c;低位时地…

手动搭建高可用的 kubernetes 集群(v1.16.6)

手动搭建高可用的 kubernetes 集群(v1.16.6) 目录 手动搭建高可用的 kubernetes 集群(v1.16.6) 1、组件版本和配置策略 1.1 主要组件版本1.2 主要配置策略2、初始化系统和全局变量 2.1 集群规划2.2 初始化系统环境 2.2.1 关闭防火墙2.2.2 关闭 swap 分区2.2.3 关闭 SELinux2.2.…

【网络技术】什么是CNI

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 Never look back unless you are planning to go that way. 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用…

2023年第十五届华中杯赛题A题详细版思路 新型镇静药物临床实验疗效分析与预测

2023年五一假期期间&#xff0c;数学建模竞赛就有四场&#xff0c;各种比赛各种需求应接不暇。因此&#xff0c;对于本次浅析有不足的地方欢迎大家指出。为了更好的帮助大家华中杯参赛&#xff0c;下面带来&#xff0c;A题详细版思路 问题一&#xff0c;差异性分析 文字分析&a…

JAVA基于Springboot框架的停车场管理系统开发实践和实现【附源码】

运行环境: jdk1.8idea/eclipsemaven3mysql5.6 项目技术: Java,Springboot,mybatis,mysql,jquery,html 该系统为停车场管理人员提供了对停车场中车辆&#xff0c;车位和财务的管理。操作员可以灵活地使用相关权限开展工作。在车位管理&#xff0c;车辆的停放和驶离、缴费&a…

理解Hopcroft DFA最小化算法

问题引入 在构造编译器的Scanner时&#xff0c;常见的解决方法是使用自动机技术。从文法构造出的DFA的状态数过多会影响编译器的性能。DFA中有一些状态本质上是等价的&#xff0c;我们需要一种自动化算法用于最小化DFA。 算法介绍 常见的DFA最小化算法有三种&#xff0c;分别…

栈和队列的转换

在之前的博客当中我们已经学习了栈和队列。在本次的博客当中我们就来学习一下怎么将栈和队列进行相互转换。 栈和队列的相互转换其实是两道OJ题。如果在leetcode上面刷过题的小伙伴们可能早就见过这两种数据结构的相互转换。下面我们就来分别讲解一下这两道OJ题目的编写思路。 …