97.【C语言】数据结构之栈

目录

1.基本概念

2.提炼要点

3.概念选择题

4.栈的实现

栈初始化函数

入栈函数

出栈函数和栈顶函数

栈顶函数

栈销毁函数


基本概念参见王爽老师的《汇编语言 第四版》第56和57页

节选一部分

1.基本概念

注意:这里提到的数据结构中的栈有别于操作系统的栈,后者是为函数开辟栈帧空间,局部变量存储等而服务的

2.提炼要点

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

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

3.栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则

4.压栈(push):栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶;出栈(pop):栈的删除操作叫做出栈,出数据也在栈顶

★★5.两种顺序:一边入栈,一边出栈;先入栈后出栈(这里容易出概念选择题)

3.概念选择题

若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是( )
A 1,4,3,2
B 2,3,4,1
C 3,1,4,2
D 3,4,2,1

答案:选C

4.栈的实现

可使用数组或链表

显然用数组更容易实现,数组具有在内存中连续存放的特点,缓存的命中率比链表高!

栈顶插入(STPush函数)

栈初始化函数

void STInit(ST* ps)
{
	assert(ps);
	ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);
	if (ps->a == NULL)
	{
		perror("malloc");
		return;
	}
	ps->capacity = 4;
	ps->top = 0;//top栈顶元素的下一个位置
}

一次性malloc开辟了16个字节(int*4),ps->a存储开辟空间的首地址,定义capacity=4确保之后判断push不越界

初始化时,栈中没有元素,因此ps->top=0;等待push

入栈函数

void STPush(ST* ps, STDataType x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * ps->capacity * 2);
		if (tmp == NULL)
		{
			perror("realloc");
			return;
		}
		ps->a = tmp;
		ps->capacity *= 2;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

先判断是否越界,如果ps->top == ps->capacity,则开辟两倍的空间,将新开辟空间的指针tmp交给ps->a,ps->a[ps->top] = x;以数组的形式访问栈,ps->top++;移向下个要push的位置

出栈函数和栈顶函数

void STPop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));//确保不越界
	ps->top--;
}

出栈直接改变栈指针top

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

如果assert断言通过,返回ps->a[ps->top - 1](指的是压入栈的最后一个元素,即栈顶元素(注意有-1))

	while (!STEmpty(&st))
	{
		printf("%d ", STTop(&st));//必须先访问栈顶元素,严格执行后进先出
		STPop(&st);
	}

ps不为NULL时,返回 ps->top == 0;

则  while (!STEmpty(&st))变成 while (!(ps->top == 0))

注意执行的顺序:先打印栈顶元素,再将其出栈

栈顶函数

STDataType STTop(ST* ps)//访问栈顶元素
{
	assert(ps);
	assert(!STEmpty(ps));//确保不越界
	return ps->a[ps->top - 1];
}

栈销毁函数

void STDestory(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}

free(ps->a);一次性销毁所有动态开辟的空间

将ps->a=NULL防止野指针,其余参数(top和capacity)置0恢复原样

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

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

相关文章

Spring-boot 后端java配置接口返回jsp页面

Spring-boot 后端java配置接口返回jsp页面 spring boot 基于spring MVC的基础上进行了改进, 将Controller 与ResponseBody 进行了合并成一个新的注解 RestController。 当用户请求时,需要有视图渲染的,与请求数据的请求分别使用 1.在appli…

【操作系统实验课】Makefile与编译

1. 创建项目结构 my_project 使用mkdir命令在根目录下创建项目my_project sudo mkdir /my_project 进入my_project目录 cd my_project src 在my_project目录下创建src子目录 sudo mkdir src 进入src目录 cd src root(根用户) 切换用户身份为root(根用户) root用户…

冠层四流近似模型的发展历史

1. Kunbelka-Munk theory This is the earlist model using a two-stream approximation d I d z − ( k s ) I s J d J d z ( k s ) J − s I \begin{aligned} &\frac{dI}{dz} -(ks)IsJ\\ &\frac{dJ}{dz} (ks)J - sI \end{aligned} ​dzdI​−(ks)IsJdzdJ​(…

Linux从0——1之shell编程4

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

2024.5 AAAiGLaM:通过邻域分区和生成子图编码对领域知识图谱对齐的大型语言模型进行微调

GLaM: Fine-Tuning Large Language Models for Domain Knowledge Graph Alignment via Neighborhood Partitioning and Generative Subgraph Encoding 问题 如何将特定领域知识图谱直接整合进大语言模型(LLM)的表示中,以提高其在图数据上自…

【大语言模型】ACL2024论文-15 大型语言模型中的最佳解释推断

【大语言模型】ACL2024论文-15 大型语言模型中的最佳解释推断 目录 文章目录 【大语言模型】ACL2024论文-15 大型语言模型中的最佳解释推断目录摘要研究背景问题与挑战如何解决创新点算法模型实验效果推荐阅读指数:★★★★☆后记 大型语言模型中的最佳解释推断 摘…

【最新鸿蒙开发之性能优化——动态加载和延迟加载】

大家好,我是学徒小z,在经历了一段时间项目开发中,我也渐渐意识到了性能的重要性,今天就分享一篇优化应用运行性能的文章,话不多说,开干! 引言 延时触发操作与延迟加载的简介 动态加载&#x…

云计算研究实训室建设方案

一、引言 随着云计算技术的迅速发展和广泛应用,职业院校面临着培养云计算领域专业人才的迫切需求。本方案旨在构建一个先进的云计算研究实训室,为学生提供一个集理论学习、实践操作、技术研发与创新于一体的综合性学习平台,以促进云计算技术…

信号保存和信号处理

目录 信号保存中重要的概念 内核中信号的保存 对sigset_t操作的函数 对block,pendding,handler三张表的操作 sigpromask ​编辑 sigpending 是否有sighandler函数呢? 案例 信号处理 操作系统是如何运行的? 硬件中断 …

用vscode编写verilog时,如何有信号定义提示、信号定义跳转(go to definition)、模块跳转(跨文件跳转)这些功能

(一)方法一:安装插件SystemVerilog - Language Support 安装一个vscode插件即可,插件叫SystemVerilog - Language Support。虽然说另一个插件“Verilog-HDL/SystemVerilog/Bluespec SystemVerilog”也有信号提示及定义跳转功能&am…

初识算法 · 模拟(1)

目录 前言: 替换所有的问号 题目解析 算法原理 算法编写 提莫攻击 题目解析 算法原理 算法编写 外观数列 题目解析 算法原理 算法编写 前言: ​本文的主题是模拟,通过三道题目讲解,一道是提莫攻击,一道是…

〔 MySQL 〕数据类型

目录 1.数据类型分类 2 数值类型 2.1 tinyint类型 2.2 bit类型 2.3 小数类型 2.3.1 float 2.3.2 decimal 3 字符串类型 3.1 char 3.2 varchar 3.3 char和varchar比较 4 日期和时间类型 5 enum和set mysql表中建立属性列: 列名称,类型在后 n…

数据结构王道P234第二题

#include<iostream> using namespace std; int visit[MAxsize]; int color[MaxSize];//1表示红&#xff0c;2表示白&#xff1b; bool dfs(Graph G, int i){visit[i]1;ArcNode *p;bool flag1;for(pG.vertices[i].firsrarc; p ; pp->next){int jp->adjvex;if(!visi…

算法——两两交换链表中的节点(leetcode24)

这是一道对于链表节点进行操作的题目非常考验对于链表操作的基本功&#xff1b; 解法: 本题的解法结合下图来进一步解释 创建一个虚拟节点指向头结点以便使代码逻辑看起来更为简便且操作节点容易,定义cur是为了方便找到cur之后的两个节点进行交换操作定义pre和aft是为了保存执…

【AI图像生成网站Golang】项目架构

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与调试(等待更新) 四、项目架构 本项目的后端基于Golang和Gin框架开发&#xff0c;主要包括的模块有&#xff1a; backend/ ├── …

翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践

引言&#xff1a;自2021年起&#xff0c;翼鸥教育便开始应用OceanBase社区版&#xff0c;两年间&#xff0c;先后部署了总计12套生产集群&#xff0c;其中核心集群占比超过四分之三&#xff0c;所承载的数据量已突破30TB。自2022年10月&#xff0c;OceanBase 社区发布了4.2.x 版…

ESP32-S3模组上跑通esp32-camera(19)

接前一篇文章&#xff1a;ESP32-S3模组上跑通esp32-camera&#xff08;18&#xff09; 本文内容参考&#xff1a; esp32-camera入门&#xff08;基于ESP-IDF&#xff09;_esp32 camera-CSDN博客 OV5640手册解读-CSDN博客 ESP32_CAM CameraWebServer例程源码解析笔记&#xf…

vmWare虚拟环境centos7安装Hadoop 伪分布式实践

背景&#xff1a;近期在研发大数据中台&#xff0c;需要研究Hadoop hive 的各种特性&#xff0c;需要搭建一个Hadoop的虚拟环境&#xff0c;本来想着使用dock &#xff0c;但突然发现docker 公共仓库的镜像 被XX 了&#xff0c;无奈重新使用vm 搭建虚拟机。 大概经历了6个小时完…

ARM(安谋) China处理器

0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China&#xff0c;2018年4月established&#xff0c;独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1&#xff08;星辰处理器&#xff09; STAT-MC1&#xff0c;主要为满足AIOT应用性能、功…

c++--------《set 和 map》

c--------《set 和 map》 1 set系列的使⽤1.1 set类的介绍1.2 set的构造和迭代器1.3 set重要接口 2 实现样例2.1: insert和迭代器遍历使⽤样例&#xff1a;2.2: find和erase使⽤样例&#xff1a; 练习3.map系列的使用3.1 map类的介绍3.1.1 pair类型介绍 3.2 map的数据修改3.3mu…