栈详解(C语言)

文章目录

  • 写在前面
  • 1 栈的定义
  • 2 栈的初始化
  • 3 数据入栈
  • 4 数据出栈
  • 5 获取栈顶元素
  • 6 获取栈元素个数
  • 7 判断栈是否为空
  • 8 栈的销毁

写在前面

本片文章详细介绍了另外两种存储逻辑关系为 “一对一” 的数据结构——栈和队列中的栈,并使用C语言实现了数组栈。
栈C语言实现源码:栈源码
以栈在存储数据时具有特殊的顺序规则:
:使用栈结构存储数据,遵循“**先进后出”**的原则,即最先进栈的数据最后出栈。栈可以分为顺序栈(基于数组实现)和链栈(基于链表实现)。
在这里插入图片描述

栈的实现方式分为顺序和链式结构,分别适用于不同的场景。顺序结构在内存中占据一块连续的空间,而链式结构通过节点之间的指针连接。这使得栈和队列在实际应用中更灵活,可以根据具体需求选择不同的实现方式。

1 栈的定义

栈结构的定义通常包括一个动态开辟的数组,用来存储数据,一个用于记录栈顶位置以及一个用于记录栈容量的变量。下面是栈结构的定义:

typedef int STDataType;

//数组栈
typedef struct Stack
{
	STDataType* nums;//动态开辟的数组
	int top;//栈顶位置
	int capacity;//栈容量
}Stack;

2 栈的初始化

刚开始栈是一个空栈,因此需要将栈的元素数组指针 nums 初始化为 NULL,表示栈中当前没有元素。capacity 表示栈的容量,初始时为0,表示栈中没有元素。而将top 初始化为0,表示top指向栈顶元素的下一个位置
代码如下:

void StackInit(Stack* pst)
{
	assert(pst);//检查参数有效性
	pst->nums = NULL;

	pst->top = pst->capacity = 0;//top初始化为0,说明top指向栈顶元素的下一个位置
}

3 数据入栈

数据入栈的操作:

  1. 检查栈是否已满,如果满了要进行扩容操作。
  2. 根据上面栈的初始化操作,我们知道,top是指向栈顶元素的下一个位置,因此,数据入栈时,只需将数据放在top指向的位置,再将top向后移动一个位置即可。

图解如下:
在这里插入图片描述
代码如下:

void StackPush(Stack* pst, STDataType x)
{
	assert(pst); //检查参数有效性
	//检查是否需要扩容
	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(pst->nums, sizeof(STDataType) * newcapacity);
		if (tmp == NULL)
		{
			perror("StackPush->malloc");
			exit(-1);
		}
		pst->nums = tmp;
		pst->capacity = newcapacity;
	}
	//元素入栈
	pst->nums[pst->top++] = x;
}

4 数据出栈

我们知道,栈只能在栈顶一端出入数据,出数据时只能出栈顶的数据。
数据出栈的步骤如下:

  1. 在执行出栈操作之前,需要检查栈是否为空。如果栈为空(即没有数据),则无法执行出栈操作,因为没有数据可以出栈。
  2. 如果栈不为空,即存在数据,就可以执行出栈操作。调整栈顶指针 top,通过将 top 向前移动一个位置,实现了出栈操作(这里是数组栈,top指向栈顶元素的下一个位置)。

图解如下:
在这里插入图片描述

代码如下:

void StackPop(Stack* pst)
{
	assert(pst);//检查参数有效性
	assert(!StackEmpty(pst));//为空不能进行删除

	//元素出栈
	pst->top--;
}

5 获取栈顶元素

取栈顶元素的步骤如下:

  1. 在执行取栈顶元素操作之前,需要检查栈是否为空。如果栈为空(即没有数据),则无法执行此操作。
  2. top指向栈顶元素的下一个位置,如要获取栈顶元素,因此只需返回top-1位置的元素即可。
    在这里插入图片描述

代码如下:

STDataType StackTop(Stack* pst)
{
	assert(pst);//检查参数有效性
	assert(!StackEmpty(pst));//为空不能取栈顶元素

	return pst->nums[pst->top - 1];
}

6 获取栈元素个数

栈的栈顶指针top是指向栈顶元素的下一个位置,同时top的值也是栈元素个数。
在这里插入图片描述
代码如下:

int StackSize(Stack* pst)
{
	assert(pst);//检查参数有效性

	return pst->top;
}

7 判断栈是否为空

根据初始化栈的函数我们知道,当栈为空时,栈的栈顶指针top是指向nums数组的0位置。
在这里插入图片描述
代码如下:

bool StackEmpty(Stack* pst)
{
	assert(pst);//检查参数有效性

	return pst->top == 0;
}

8 栈的销毁

根据栈结构的定义,我们知道,栈用来存储数据的数组,是动态申请的,因此栈在销毁时需要手动释放动态申请的空间,同时将top和capacity置为0。
代码如下:

void StackDestroy(Stack* pst)
{
	assert(pst);//检查参数有效性

	free(pst->nums);

	pst->nums = NULL;
	pst->top = pst->capacity = 0;
}

至此,本片文章就结束了,若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。
创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
如果本篇博客有任何错误,请批评指教,不胜感激 !!!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java基于springoot开发的企业招聘求职网站

演示视频: https://www.bilibili.com/video/BV1xw411n7Tu/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 技术:springootmysqlvuejsbootstrappoi制作word模板 主要功能:求职者可以注册发布简历,选择简…

Redis面试题:redis做为缓存,mysql的数据如何与redis进行同步呢?(双写一致性)

目录 强一致性:延迟双删,读写锁。 弱一致性:使用MQ或者canal实现异步通知 面试官:redis做为缓存,mysql的数据如何与redis进行同步呢?(双写一致性) 候选人:嗯&#xff…

抖音生态融合:开发与抖音平台对接的票务小程序

为了更好地服务用户需求,将票务服务与抖音平台结合,成为了一个创新的方向。通过开发票务小程序,用户可以在抖音平台上直接获取相关活动的票务信息,完成购票、预订等操作,实现了线上线下的有机连接。 一、开发过程 1…

赢麻了!义乌一个村有5000个网红,有人年收租就300万!

#义乌一村电商年成交额超300亿# ,在中国,电商行业的发展可谓是日新月异,而位于浙江省义乌市的江北下朱村,正是这股潮流的一个典型代表。这个村子,处处弥漫着“直播”的气息,仿佛每个人都在为这个新兴行业助力。 江北下…

网安融合新进展:Check Point+七云网络联合研发,加固大型企业边缘、分支侧安全

AI 爆火、万物互联,底层需要更灵活的网络设施提供支撑。据国际分析机构 Gartner 预测,到 2024 年,SD-WAN(软件定义的广域网)使用率将达到 60%。不过边缘和终端兴起,未经过数据中心的流量也在成为新的安全风…

居家适老化设计第三十一条---卫生间水龙头

以上产品图片均来源于淘宝 侵权联系删除 居家适老化中,水龙头是一个非常重要的设备。水龙头的选择应该考虑到老年人的特点和需求。首先,水龙头的操作应该简单方便,老年人手部灵活性可能不如年轻人,因此水龙头应该设计成易于转动和…

torch.nn.batchnorm1d,torch.nn.batchnorm2d,torch.nn.LayerNorm解释:

批量归一化是一种加速神经网络训练和提升模型泛化能力的技术。它对每个特征维度进行标准化处理,即调整每个特征的均值和标准差,使得它们的分布更加稳定。 Batch Norm主要是为了让输入在激活函数的敏感区。所以BatchNorm层要加在激活函数前面。 1.torch.…

处理分类问题的不平衡数据的 5 种技术

一、介绍 分类问题在机器学习领域很常见。正如我们所知,在分类问题中,我们试图通过研究输入数据或预测变量来预测类标签,其中目标或输出变量本质上是分类变量。 如果您已经处理过分类问题,那么您一定遇到过以下情况:其…

【Go实现】实践GoF的23种设计模式:备忘录模式

上一篇:【Go实现】实践GoF的23种设计模式:命令模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Pattern–Go-Implementation 简介 相对于代理模式、工厂模式等设计模式&…

PyQt6把QTDesigner生成的UI文件转成python源码,并运行

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计18条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…

1.1 C语言之入门:使用Visual Studio Community 2022运行hello world

1.1 使用Visual Studio Community 2022运行c语言的hello world 一、下载安装Visual Studio Community 2022 与 新建项目二、编写c helloworld三、编译、链接、运行 c helloworld1. 问题记录:无法打开源文件"stdio.h"2. 问题记录:调试和执行按钮…

Pinctrl子系统和GPIO子系统

Pinctrl子系统: 借助Princtr子系统来设置一个Pin的复用和电气属性; pinctrl子系统主要做的工作是:1. 获取设备树中的PIN信息;2.根据获取到的pin信息来设置的Pin的复用功能;3.根据获取到的pin信息去设置pin的电气特性…

vue+elementui如何实现在表格中点击按钮预览图片?

效果图如上&#xff1a; 使用el-image-viewer 重点 &#xff1a; 引入 import ElImageViewer from "element-ui/packages/image/src/image-viewer"; <template><div class"preview-table"><el-table border :data"tableData" …

Proteus仿真--高仿真数码管电子钟

本文介绍基于数码管的高仿真电子钟&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 本设计中80C51单片机作为主控&#xff0c;用74LS138作为数码管显示控制&#xff0c;共有4个按键&#xff0c;其中分别用于12/24小时显示切换、时间设置、小时加减控制和…

ZKP11.2 Fiat-Shamir and SNARGs

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 11: From Practice to Theory (Guest Lecturer: Alex Lombardi) 11.2 Fiat-Shamir and SNARGs Succinct Non-Interactive Arguments (SNARGs) This class so far: constructions of SNARGs using IOPs and a random oracle. …

3、MSF使用

文章目录 一、利用ms17-010漏洞对靶机执行溢出攻击二、后渗透模块meterpreter的使用 一、利用ms17-010漏洞对靶机执行溢出攻击 分别输入以下命令&#xff0c;使用ms17_010_eternalblue模块对目标机的ms17-010漏洞进行利用&#xff1a; use exploit/windows/smb/ms17_010_eter…

【机器学习 | 聚类】关于聚类最全评价方法大全,确定不收藏?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

贝叶斯个性化排序损失函数

贝叶斯个性化排名&#xff08;Bayesian Personalized Ranking, BPR&#xff09;是一种用于推荐系统的机器学习方法&#xff0c;旨在为用户提供个性化的排名列表。BPR的核心思想是通过对用户历史行为数据的分析&#xff0c;对用户可能喜欢和不喜欢的物品对&#xff08;item pair…

时间序列预测 — Informer实现多变量负荷预测(PyTorch)

目录 1 实验数据集 2 如何运行自己的数据集 3 报错分析 1 实验数据集 实验数据集采用数据集4&#xff1a;2016年电工数学建模竞赛负荷预测数据集&#xff08;下载链接&#xff09;&#xff0c;数据集包含日期、最高温度℃ 、最低温度℃、平均温度℃ 、相对湿度(平均) 、降雨…

Kibana部署

服务器 安装软件主机名IP地址系统版本配置KibanaElk10.3.145.14centos7.5.18042核4G软件版本&#xff1a;nginx-1.14.2、kibana-7.13.2-linux-x86_64.tar.gz 1. 安装配置Kibana &#xff08;1&#xff09;安装 [rootelk ~]# tar zxf kibana-7.13.2-linux-x86_64.tar.gz -C…