手撕栈和队列

news2024/11/17 15:59:57

接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧 

引言 

栈和队列作为数据结构的重要组成部分,可以用栈实现非递归等,为后面学习打基础。栈由数组来实现,队列由链表来实现,接下来将详细介绍

一:栈

1.定义:

栈是一种线性表结构,在栈顶插入和删除数据,栈底不做任何操作,不含任何元素的栈称为空栈,主要特性为后进先出(First in Last out)LIFO结构

2.特性

FILO结构,栈在栈顶插入数据称为入栈,栈顶删除数据称为出栈

3.栈的结构定义

4.数组实现栈 

//栈的初始化
void STInit(ST* pst);
//入栈
void STPush(ST* pst,STDataType x);
//出栈
void STPop(ST* pst);
//栈的销毁
void STDestroy(ST* pst);
//判空
bool STEmpty(ST* pst);
//显示栈顶元素
STDataType STTopData(ST* pst);
//判断开辟大小
int STSize(ST* pst);
void STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	pst->capacity = 0;
	pst->top = 0;//pst指向栈顶元素的下个位置
	//pst->top=-1;//指向栈顶元素
}
//入栈
void STPush(ST* pst, STDataType x)
{
	assert(pst);
	if (pst->top == pst->capacity)//判断空间大小,是否扩容
	{
		int newCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		//开辟空间
		STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newCapacity);
		if (tmp == NULL)
		{
			perror("realloc failue\n");
			return;
		}
		pst->a = tmp;
		pst->capacity = newCapacity;
	}
	//入栈
	pst->a[pst->top] = x;
	pst->top++;
}
//出栈
void STPop(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));
	pst->top--;
}
//栈的销毁
void STDestroy(ST* pst)
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = pst->top = 0;
}
//判空
bool STEmpty(ST* pst)
{
	assert(pst);
	return pst->top == 0;
}
//显示栈顶元素
STDataType STTopData(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));
	return pst->a[pst->top - 1];
}
//判断开辟大小
int STSize(ST* pst)
{
	assert(pst);
	return pst->top;
}

二:队列 

1.定义:

队列是一种先进先出(First in First out)的线性表,简称FIFO.在队尾插入数据,队头删除数据,通常由单链表来实现

2.队列的结构定义:

 3.单链表实现队列

//队列之初始化
void QueueInit(Queue* pq);
//队列之销毁
void QueueDestroy(Queue* pq);
//队列之队尾插入
void QueuePush(Queue* pq,QueueDataType x);
//队列之队头的删除
void QueuePop(Queue* pq);
//队列之队头数据
QueueDataType QueueFront(Queue* pq);
//队列之队尾数据
QueueDataType QueueBack(Queue* pq);
//队列之判空
bool QueueEmpty(Queue* pq);
//队列之大小
int QueueSize(Queue* pq);
//队列之初始化
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}
//队列之销毁
void QueueDestroy(Queue* pq)
{
	assert(pq);
	QueueNode* cur = pq->phead;
	while (cur)
	{
		QueueNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->phead=pq->ptail=NULL:
	pq->size = 0;
}
//队列之队尾插入
void QueuePush(Queue* pq,QueueDataType x)
{
	assert(pq);
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode == NULL)
	{
		perror("malloc fail\n");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->ptail == NULL)//空链表
	{
		assert(pq->phead == NULL);
		pq->phead = pq->ptail = newnode;
	}
	else//非空链表
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	pq->size++;
}
//队列之队头的删除
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));//空链表不能删除
	if (pq->phead->next == NULL)//一个节点
	{
		freee(pq->phead);
		pq->ptail = NULL;
	}
	else//多个结点
	{
		Queue* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
	pq->size--;
}
//队列之队头数据
QueueDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->phead->data;
}
//队列之队尾数据
QueueDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->ptail->data;
}
//队列之判空
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->size == 0;
}
//队列之大小
int QueueSize(Queue* pq)
{
	assert(pq);
	return pq->size;
}

三:总结

栈和队列作为重要的数据结构组成部分,将在后面学习中经常使用到

 

 

                                                                                                                                                                                                                                                                                                                                                                                                                                                     

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

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

相关文章

C++实现引用计数(二)

实现引用计数 引言实现集成开发环境项目结构实现代码运行结果 注意 引言 C中经常使用智能指针来管理内存。对于共享指针shared_ptr的原理:每当有一个指针指向这块内存,引用计数的值加一,每当一个指针不再指向这块内存,引用计数的…

【OpenGL手册14】投光物

目录 一、说明二、平行光三、点光源四、衰减五、选择正确的值六、实现衰减七、聚光八、手电筒九、平滑/软化边缘练习 一、说明 我们目前使用的光照都来自于空间中的一个点。它能给我们不错的效果,但现实世界中,我们有很多种类的光照,每种的表…

员工私单亡羊补牢!这个监管神器让你从此放心!

对于企业而言,如何有效监管员工的微信使用成为了一项重要的任务。幸运的是,现在有一个监管神器——微信管理系统,可以帮助企业从根本上解决这个问题。 接下来,让我们一起来看看这个监管神器究竟有哪些神奇的功能吧! …

5款好用的AI办公软件,一键轻松制作PPT、视频,提升工作效率!

众所周知,AI 人工智能技术已渗透到生活的方方面面,无论是很多人早已用上的智能音箱、语音助手,还是新近诞生的各种 AI 软件工具,背后都离不开 AI 人工智能技术的加持。 对于各类新生的 AI 软件工具,人们很容易「选边站…

亚马逊多账号怎么防关联?超级浏览器来帮你!

很多做亚马逊跨境电商的小伙伴都会遇到的问题就是多登店铺账号被关联,我们要知道,如果在亚马逊上运营多个店铺,保持账户之间的独立性是很重要的。一旦账户之间被平台识别为关联,不仅可能导致收入损失,还可能面临账号被…

短视频,文案素材哪里找?找短视频文案素材指南

有很多创业者,耗费了很长时间创作出了很多短视频,文案素材没写好,导致浏览量下降,或者写文案的同时就已经花费了很长时间,导致没有时间发布视频,从而影响了流量,导致流量下滑,其实我…

React-嵌套路由

1.概念 说明&#xff1a;在一级路由中又内嵌了其他路由&#xff0c;这种关系就叫做嵌套路由&#xff0c;嵌套至一级路由内的路由又称作二级路由。 2.实现步骤 说明&#xff1a;使用childen属性配置路由嵌套关系&#xff0c;使用<Outlet/>组件配置二级路由渲染的位置。…

RK3588-hdmiin

1. HDMI-IN简介 HDMI IN功能可以通过桥接芯⽚的⽅式实现&#xff0c;将HDMI信号转换成MIPI信号接收RK3588芯⽚平台⾃带HDMI RX模块&#xff0c;可以直接接收HDMI信号&#xff0c;无需通过桥接芯⽚实现。在ArmSoM系列产品中&#xff0c;ArmSoM-W3支持HDMI-IN功能HDMI-IN功能框图…

容灾演练双月报|美创DRCC助力银行高效验证数据库高可用架构

了解更多灾备行业动态 守护数字化时代业务连续 目录 CONTENTS 01 灾备法规政策 02 热点安全事件 03 容灾演练典型案例 01 灾备法规政策 2月&#xff0c;工信部印发《工业领域数据安全能力提升实施方案&#xff08;2024—2026年&#xff09;》&#xff0c;要求到2026年…

Java语言的演变之路:从过去到现在,以及未来的展望与探索

引言 Java&#xff0c;这个在全球范围内广受欢迎的编程语言&#xff0c;自其诞生之日起&#xff0c;就注定要在计算机科学的历史上留下浓墨重彩的一笔。起源于20世纪90年代&#xff0c;Java的初衷是打造一种能够在多种平台上运行的、安全且易于使用的编程语言。它不仅成功地实…

MySQL-QA-异常问题及解决方案(持续更新)

MySQL-Q&A(持续更新) 1.1 PID文件找不到 问题描述 错误详情&#xff1a; ERROR&#xff01;The server quit without updating PID file (/usr/local/mysql/data/localhost.localdomain.pid) 解决方案 首先排查配置文件&#xff0c;一般路径为&#xff1a;/etc/my.cnf 检查…

【C++】stack/queue

链表完了之后就是我们的栈和队列了&#xff0c;当然我们的STL中也有实现&#xff0c;下面我们先来看一下简单用法&#xff0c;跟我们之前C语言实现的一样&#xff0c;stack和queue有这么几个重要的成员函数 最主要的就是这么几个&#xff1a;empty&#xff0c;push&#xff0c;…

嘿!AI 编码新玩法上线!

随着 AI 智能浪潮到来&#xff0c;AI 编码助手成为越来越多开发者的必备工具&#xff0c;将开发者从繁重的编码工作中解放出来&#xff0c;极大地提高了编程效率&#xff0c;帮助开发者实现更快、更好的代码编写。 通义灵码正是这样一款基于阿里云通义代码大模型打造的智能编码…

ReorderData - 优化阅读笔记

主要实现文件: bolt/lib/Passes/ReorderData.cpp 支持 X86/Arm 测试用例&#xff1a; bolt/test/reorder-data-writable-ptload.c int a1,a2,a3,a4; // 待补充默认关闭&#xff0c;开启选项&#xff1a; # 指定要重排的数据段 --reorder-data<section1,section2,section3…

【ArcGIS】栅格数据进行标准化(归一化)处理

栅格数据进行标准化&#xff08;归一化&#xff09;处理 方法1&#xff1a;栅格计算器方法2&#xff1a;模糊分析参考 栅格数据进行标准化(归一化)处理 方法1&#xff1a;栅格计算器 栅格计算器&#xff08;Raster Calculator&#xff09; 方法2&#xff1a;模糊分析 空间…

Spring Boot Starter 与自动装配(Boot 3.0版本)

Spring Boot Starter 与自动装配 1、Starter Starter可以理解为Spring Boot中的一站式集成启动器&#xff0c;它包含了一系列可以集成到应用中的依赖项&#xff08;dependencies&#xff09;&#xff0c;可以快速一站式集成Spring组件及其他框架&#xff0c;而不需要到处找示…

CAP告诉你系统没法做到完美,只能做到权衡和适当

一、CAP介绍 CAP原理&#xff0c;全称为Consistency&#xff08;一致性&#xff09;、Availability&#xff08;可用性&#xff09;和Partition tolerance&#xff08;分区容错性&#xff09;&#xff0c;是分布式系统设计中的基本原理。它强调了在设计分布式系统时&#xff0c…

【深度学习笔记】优化算法——学习率调度器

学习率调度器 &#x1f3f7;sec_scheduler 到目前为止&#xff0c;我们主要关注如何更新权重向量的优化算法&#xff0c;而不是它们的更新速率。 然而&#xff0c;调整学习率通常与实际算法同样重要&#xff0c;有如下几方面需要考虑&#xff1a; 首先&#xff0c;学习率的大…

Verovio简介及在Windows10和Ubuntu 22.04上编译过程

Verovio是一个快速、便携、轻量级的开源库&#xff0c;用于将音乐编码倡议(Music Encoding Initiative(MEI))数字乐谱雕刻到SVG图像中。Verovio还包含即时转换器(on-the-fly converters)用于渲染Plaine & Easie Code、Humdrum、Musedata、MusicXML、EsAC和ABC数字乐谱。源代…

SSL证书:构建网络安全的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…