数据结构——栈(C语言)

news2024/11/17 6:42:34

需求:无

栈的概念:

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

 

 栈的图示:

  • 栈的实现一般可以使用数组和链表实现,相对而言数组结构实现更优一些。因为尾插时代价小很多。(不用遍历)

 

栈的判空:

栈的判空有二种实现方式,一种是top赋为0,一种是top赋为-1。区别:是top为0的时候,是先赋值再++,top为-1的时候相反。

 

 栈的应用场景:

  • 函数的调用:操作系统会给每一个线程分配一个独立的内存空间,每一个内存空间其实就是一个栈结构,它会将临时标量,参数等等放到栈中,当栈执行完的时候,就会将最近的一个栈帧出栈。
  • 括号匹配,判断括号是否匹配,例如([]),[({})]

下面是源码:

void StackInit(Stack* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

void StackPush(Stack* ps, STDateType x)
{
	assert(ps);

	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDateType* tmp = (STDateType*)realloc(ps->a, sizeof(STDateType) * newcapacity);
		
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}

		ps->a = tmp;
		ps->capacity = newcapacity;
	}

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

void StackPop(Stack* ps)
{
	assert(ps);
	assert(ps->top > 0);

	--ps->top;
}

STDateType StackTop(Stack* ps)
{
	assert(ps);
	assert(ps->top > 0);

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

int StackSize(Stack* ps)
{
	assert(ps);

	return ps->top;
}

bool StackEmpty(Stack* ps)
{
	assert(ps);

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

void StackDestroy(Stack* ps)
{
	assert(ps);

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

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

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

相关文章

FPGA应用学习笔记-----布线布局优化

优化约束: 设置到最坏情况下会过多 布局和布线之间的关系: 最重要的是与处理器努力的,挂钩允许设计者调整处理器努力的程度 逻辑复制: 不能放置多个负载,只使用在关键路径钟 减少布线延时,但会增加面积&a…

大规模SFT微调指令数据的生成

前言 想要微调一个大模型,前提是得有一份高质量的SFT数据,可以这么说其多么高质量都不过分,关于其重要性已经有很多工作得以验证,感兴趣的小伙伴可以穿梭笔者之前的一篇文章: 《大模型时代下数据的重要性》&#xff…

【AI】百度AI助力开发,测试一下百度搜索的AI能力如何

百度搜索页面有个AI对话,点击进去看看: 是不是文心一言?它说不是。 测试一下辅助写代码功能: 1、写个爬虫: 代码: import requests from bs4 import BeautifulSoup# 目标网站的URL url "http:/…

Ubuntu虚拟机网络无法连接的几种解决方法

虚拟机网络无法连接的几种解决方法 问题状况描述可能的解决方案 问题状况描述 Ubuntu虚拟机没有网络,无法ping通互联网,左上角网络连接图标消失等情况可能的解决方案 1.重启虚拟机网络编辑器 2.重启虚拟机网络适配器 3.重启虚拟机网络服务器1.重启网络…

优思学院|五大工具:APQP、FMEA、MSA、SPC、PPAP

在现代制造业中,质量是企业成功的关键之一。为了确保产品和过程的质量,需要采用一系列有效的工具和方法。APQP、FMEA、MSA、SPC和PPAP被认定为质量管理体系的五大核心工具,这些工具不仅在汽车行业中得到广泛应用,还被其他制造领域…

生信豆芽菜-分组比较的表格

网址:http://www.sxdyc.com/visualsCliTableCompare 1、数据准备 两列的数据,最后比较这两组的样本分布 2、选择两个分组的颜色,有几个就选几个颜色,表头颜色,图片的宽度和高度,提交等待运行成功 3、结…

PHP入门基础教程 - 专栏导读

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责…

148. 排序链表

题目描述 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例 3&#…

【仿写tomcat】四、解析http请求信息,响应给前端,HttpServletRequest、HttpServletResponse的简单实现

思考 在解析请求之前我们要思考一个问题,我们解析的是其中的哪些内容? 对于最基本的实现,当然是请求类型,请求的url以及请求参数,我们可以根据请求的类型作出对应的处理,通过url在我们的mapstore中找到se…

计算机控制技术|17/8|11:32

目录 1. 学习计算控制系统需要的相关知识有哪些? 2. 计算机控制系统是什么? 3. 计算机控制系统的主要研究内容是什么? 4. 计算机控制系统的主要特点是什么? 5. 计算机控制系统的性能指标主要有哪些? 6. 计算机控…

学生宿舍管理系统(前端java+后端Vue)源码

完整资料下载链接 界面介绍 登录 宿舍管理 菜单管理 角色管理 ###班级管理

Nginx常见的三个漏洞

目录 $uri导致的CRLF注入漏洞 两种常见场景 表示uri的三个变量 案例 目录穿越漏洞 案例 Http Header被覆盖的问题 案例 $uri导致的CRLF注入漏洞 两种常见场景 用户访问http://example.com/aabbcc,自动跳转到https://example.com/aabbcc 用户访问http://exa…

Java中的枚举类型

一,什么是枚举 在Java中,枚举(Enumeration)是一种特殊的数据类型,它允许我们定义一个固定数量的常量集合。枚举类型在Java中是通过关键字enum来定义的。每个枚举常量都是枚举类型的实例,它们在枚举类型中以…

【RP2040】香瓜树莓派RP2040之自定义的短按、双击、长按按键

本文最后修改时间:2022年09月15日 11:02 一、本节简介 本节介绍如何编写一个可以自己选择引脚的短按、双击、长按三种方式的按键驱动。 二、实验平台 1、硬件平台 1)树莓派pico开发板 ①树莓派pico开发板*2 ②micro usb数据线*2 2)电脑…

【数据结构】 List与顺序表及接口的实现

文章目录 什么是List常见接口介绍线性表顺序表顺序表接口的实现add在末尾新增元素在 pos 位置新增元素判定是否包含某个元素查找某个元素对应的位置获取 pos 位置的元素给 pos 位置的元素设为 value删除第一次出现的关键字key获取顺序表的长度清空顺序表 顺序表的优缺点优点&am…

网络通信原理UDP协议(第五十课)

UDP协议:用户数据包协议,无连接、不可靠,效率高 字段长度描述Source Port2字节标识哪个应用程序发送(发送进程)。Destination Port2字节标识哪个应用程序接收(接收进程)。Length2字节UDP首部加上UDP数据的字节数,最小为8。Checksum2字节覆盖UDP首部和UDP数据,是可…

网络通信原理TCP的四次断开连接(第四十九课)

FIN:发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接。 SEQ:序号字段。 TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。 序列号为X ACK :确认号 。 …

【操作系统】24王道考研笔记——第二章 进程与线程

第二章 进程与线程 一、进程与线程 1.进程的概念 程序:是静态的,就是个存放在磁盘里的可执行文件,如:QQ.exe。 进程:是动态的,是程序的一次执行过程,如:可同时启动多次QQ程序 引…

stable diffusion基础

整合包下载:秋叶大佬 【AI绘画8月最新】Stable Diffusion整合包v4.2发布! 参照:基础04】目前全网最贴心的Lora基础知识教程! VAE 作用:滤镜微调 VAE下载地址:C站(https://civitai.com/models…

目录扫描工具—dirsearch使用指南

一:工具简介 dirsearch是一个基于Python3的命令行工具,旨在对web服务器中的目录和文件进行暴力破解,既暴力扫描页面结构,包括网页中的目录和文件。 下载地址: 1: https://github.com/maurosoria/dirsear…