【数据结构】--栈

👌个人主页: 起名字真南
🤣个人专栏:【数据结构初阶】 【C语言】

请添加图片描述

目录

  • 1 栈
    • 1.1 栈的概念和结构
    • 1.2 栈的实现
      • 1.2.1 头文件
      • 1.2.2 初始化
      • 1.2.3 销毁
      • 1.2.4 打印所有元素
      • 1.2.5 入栈
      • 1.2.6 出栈
      • 1.2.7 获取栈顶数据
      • 1.2.8 判空
      • 1.2.9 获取元素个数

1 栈

1.1 栈的概念和结构

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

压栈:栈的插入操作叫做压栈/ 进栈。
出栈:栈的删除操作叫做出栈。
不管是压栈还是出栈都在栈顶

在这里插入图片描述

1.2 栈的实现

栈的实现一般可以用数组或者链表进行实现,但相对而言使用数组的结构实现更优越些,因为数组在尾插数据比较方便。

1.2.1 头文件

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>

typedef int StackDataType;

typedef struct Stack
{
	StackDataType* arr;  
	int top;  //记录栈顶的数据
	int capacity; //记录空间的大小

}Stack;

//初始化
void StackInit(Stack* ST);

//销毁
void StackDestroy(Stack* ST);

//打印数据
void StackPrint(Stack ST);

//插入数据
void StackPush(Stack* ST, StackDataType data);

//删除数据
void StackPop(Stack* ST, StackDataType data);

//取栈顶数据
StackDataType StackTop(Stack* ST);

//判空
bool StackEmpty(Stack* ST);

//获取数据个数
int STSize(Stack* pst);

1.2.2 初始化

我们可以看到栈的初始化和顺序表的初始化基本一致。所以这次我们在初始化的时候给定capacity = 4,因为初始有空间所以在给数组初始化的时候要开辟空间,使用malloc,然后定义top来记录栈顶的数据。


void StackInit(Stack* ST)
{
	assert(ST);
	ST->arr = (StackDataType*)malloc(4 * sizeof(StackDataType));
	ST->capacity = 4;
	ST->top = 0;
}

1.2.3 销毁

因为数组是一串连续的空间所以直接释放首元素地址即可。

void StackDestroy(Stack* ST)
{
	free(ST->arr);
	ST->arr = NULL;
	ST->capacity = ST->top = 0;
}

1.2.4 打印所有元素

因为通过top来记录栈顶元素的原理是top作为访问栈顶元素的指针(地址)所以我们也可以根基top的大小来记录元素的数量。因为这里传的参数是结构体所以结构体的调用使用 ”.“

void StackPrint(Stack ST)
{
	assert(ST.arr);
	for (int i = 0; i < ST.top; i++)
	{
		printf("%d ", ST.arr[i]);
	}
	printf("\n");
}

1.2.5 入栈

入栈我们首先要判断空间的大小是否满了,因为top也记录着元素的数量所以直接比较即可由于在初始化的时候我们分配的空间,所以如果相等的化只有一种情况就是满了,所以我们需要对他进行扩容。

void StackPush(Stack* ST, StackDataType data)
{
	assert(ST);
	if (ST->top == ST->capacity)
	{
		StackDataType* tmp = realloc(ST->arr, 2 * sizeof(ST->arr));
		if (tmp == NULL)
		{
			perror("realloc:");
		}
		ST->arr = tmp;
		ST->capacity = 2 * (ST->capacity);
	}
	ST->arr[ST->top++] = data;
	ST->capacity++;
}

1.2.6 出栈

出栈和顺序表的尾删同理。

void StackPop(Stack* ST, StackDataType data)
{
	assert(ST);
	ST->top--;
}

1.2.7 获取栈顶数据

需要注意的是在构造函数的时候,函数的返回值类型,还有top-1记录的是栈顶的数据而top记录的是元素的个数,因为是从0开始所以相差了1.

StackDataType StackTop(Stack* ST)
{
	assert(ST);
	return ST->arr[ST->top - 1];
}

1.2.8 判空

判空的时候我们需要用到bool类型所以需要包含对应的头文件,如果ST->top == 0 成立则返回 True 否则返回False。

#include<stdbool.h>
bool StackEmpty(Stack* ST)
{
	assert(ST->arr);
	return ST->top == 0;
}

1.2.9 获取元素个数

这个也只是需要注意返回值类型为int

int STSize(Stack* pst)
{
	assert(pst);

	return pst->top;
}

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

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

相关文章

apk右键一键签名方法

使用说明 1 修改reg文件最后一行&#xff0c;修改为自己的电脑路径 2 修改bat文件apksigner_path路径为自己的SDK路径&#xff0c;将签名文件命名为platform.keystore放在该文件夹内 3 运行reg文件添加注册表后&#xff0c;要签名的apk右键选择“cux”系统签名即可 一键cux系…

ABAP开发:动态Open SQL编程案例介绍

动态Open SQL是Open SQL的扩展。它不是要求整个SQL语句都是动态指定的。通过熟悉的静态ABAP编码表达静态已知的部分&#xff0c;动态元素的部分通过动态标记指定。动态片段不明确包含在ABAP源代码中&#xff0c;而是源代码包含一个ABAP变量&#xff0c;用括号括起来作为占位符。…

【网络架构】lvs集群

目录 一、集群与分布式 1.1 集群介绍 1.2 分布式系统 1.3 集群设计原则 二、LVS 2.1 lvs工作原理 2.2 lvs集群体系架构 ​编辑 2.3 lvs功能及组织架构 2.4 lvs集群类型中术语 三、LVS工作模式和命令 3.1 lvs集群的工作模式 3.1.1 lvs的nat模式 3.1.2 lvs的dr模式 …

python-docx 使用xml为docx不同的章节段落设置不同字体

本文目录 前言一、完整代码二、代码详细解析1、处理过程解释(1) 引入库并定义路径(2) 创建docx的备份文件(3) 定义命名空间(4) 打开并处理.docx文件(5) 分析和组织文档结构(6) 设置字体(7) 保存结果前言 本文主要解决的内容,就是为一个docx的不同章节段落设置不同的字体,因为…

2024年公司加密软件排行榜(企业加密软件推荐)

在信息时代&#xff0c;企业数据安全至关重要&#xff0c;防止数据泄露和未授权访问是首要任务之一。以下是2024年备受好评的企业加密软件排行榜&#xff1a; 固信加密软件https://www.gooxion.com/ 1.固信加密软件 固信加密软件是新一代企业级加密解决方案&#xff0c;采用先…

7月开始,考研数学0️⃣基础线代30天满分规划

线代零基础&#xff1f; 那千万不要去跟李永乐老师的线代课程&#xff0c;因为李永乐老师的线代课程比较进阶&#xff0c;适合有一定基础的同学去听&#xff0c;下面这两位才是零基础线代的神&#xff01; 一个是喻老&#xff0c;另外一个是汤家凤&#xff01; 这两个老师的…

stencil 组件

stencil 组件 装饰器生命周期应用加载事件 组件定义组件如何响应数据变化 组件使用如何传递 slot如何暴露组件内部的方法供外部使用&#xff1f;Element 装饰器 Host 组件样式函数组件 stencil 提供一些装饰器、生命周期钩子和渲染函数去编写一个组件。 装饰器 装饰器是一组用…

Web网页端IM产品RainbowChat-Web的v7.0版已发布

一、关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统&#xff0c;是RainbowChat的姊妹系统&#xff08;RainbowChat是一套基于开源IM聊天框架 MobileIMSDK (Github地址) 的产品级移动端IM系统&#xff09;。 ► 详细介绍&#xff1a;http://www.52im.net/thread-2…

【Sklearn驯化-回归指标】一文搞懂机器学习中回归算法评估指标:mae、rmse等

【Sklearn驯化-回归指标】一文搞懂机器学习中回归算法评估指标&#xff1a;mae、rmse等 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免…

大学计算机

项目一 了解计算机 1.1 了解计算机的诞生及发展阶段 1.2 认识计算机的特点、应用和分类 1&#xff0e;计算机的特点 1. 计算机的特点 2.计算机的应用 3.计算机的分类 4.数量单位 1.3 了解计算机操作系统的概念、功能与种类 1.操作系统概念 2.操作系统的作用 1&#xff0e…

Linux 中变量的取用与设定

优质博文&#xff1a;IT-BLOG-CN Linux是一个多人多任务的环境&#xff0c;每个人登录系统都能取得一个bash shell&#xff0c;每个人都能够使用bash下达mail这个指令来接收自己的邮箱等等。问题是&#xff0c;bash如何得知你的邮箱是那个文件&#xff1f;这就需要『变量』的帮…

jmeter性能测试

一.jmeter基本使用 1.元件执行顺序 配置元件&#xff1b; 前置处理器&#xff1b; 定时器&#xff1b; sampler&#xff1b; 后置处理器&#xff1b;&#xff08;关联&#xff0c;正则表达式提取器&#xff09; 断言&#xff1b; 监听&#xff1b;&#xff08;不涉及顺序&…

Windows 电脑类别怎么区分?不同类别区分总结

电脑类别 Windows 电脑的类别有哪些&#xff1f;我们可以大致分为这三类&#xff1a;CopilotPC、AI PC、普通 PC。下面就来看看这些电脑类别的区别。 普通 PC 普通 PC 就是指那些标准的台式电脑或者笔记本电脑&#xff0c;它们是由中央处理器&#xff08;CPU&#xff09;以及…

【面试题】信息安全风险评估要做些什么

信息安全风险评估是识别、评估和管理信息系统中潜在风险的重要过程。它具有以下几个关键步骤&#xff1a; 1.资产识别&#xff1a; 确定需要保护的信息资产&#xff0c;如硬件、软件、数据、人员等。例如&#xff0c;企业的客户数据库、重要的业务文档等。 2.威胁评估&#…

手把手教你打造高精度STM32数字时钟,超详细步骤解析

STM32数字时钟项目详解 1. 项目概述 STM32数字时钟是一个集成了时间显示、闹钟功能、温湿度检测等多功能于一体的小型电子设备。它利用STM32的实时时钟(RTC)功能作为核心,配合LCD显示屏、按键输入、温湿度传感器等外设,实现了一个功能丰富的数字时钟系统。 2. 硬件组成 STM…

文献解读-基因编辑-第十二期|《CRISPR-detector:快速、准确地检测、可视化和注释基因组编辑事件引起的全基因组范围突变》

关键词&#xff1a;基因组变异检测&#xff1b;全基因组测序&#xff1b;基因编辑&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;CRISPR-detector: fast and accurate detection, visualization, and annotation of genome-wide mutations induced by g…

做外贸有些事说早了,未必是好事

如果说能说话&#xff0c;其实谁也会&#xff0c;但是能把话说好却并不是一个简单的事&#xff0c;而且说话的时机往往也影响着事情的结局和走向&#xff0c; 所以才有了老人常提起的那句话&#xff1a;三岁学说话&#xff0c;一生学闭嘴。 最近我又因为图省事而犯了一个错误&…

云通SIPX,您的码号资源智能调度专家!

在数字化转型的浪潮中&#xff0c;号码资源作为企业与客户沟通的重要桥梁&#xff0c;其管理效率直接关系到企业运营的成败。随着运营商对号码资源管理的规范化和精细化&#xff0c;企业对高效、智能的号码资源管理需求日益增长&#xff0c;以实现对外呼叫的降本增效。 一、什么…

JAVA编程题期末题库【中】

8.计算邮资 程序代码: public static void main(String[] args) {// 计算邮资//if多分支语句//创建对象java.util.Scanner inputnew java.util.Scanner(System.in); //提示输入用户&#xff0c;输入邮件的重量System.out.println("邮件的重量&#xff1a;");int wei…

VMware ESXi 8.0U2c macOS Unlocker OEM BIOS Huawei (华为) FusionServer 定制版

VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS Huawei (华为) FusionServer 定制版 ESXi 8.0U2 标准版&#xff0c;Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Hitachi (日立)、Fujitsu (富士通)、NEC (日电)、Huawei (华为)、xFusion (超聚…