数据结构 04

4. 栈

4.2. 链式栈

4.2.1. 特性

逻辑结构:线性结构
存储结构:链式存储结构
操作:创建,入栈,出栈,清空,获取

4.2.2. 代码实现

头文件 LinkStack.h

#ifndef __LINKSTACK_H__
#define __LINKSTACK_H__
typedef int datatype;
typedef struct linkstack
{
   datatype data;
   struct linkstack *next;
} linkstack_t;
//1.创建一个空的栈
void createEmptyLinkStack(linkstack_t **ptop);
//2.入栈,ptop是传入的栈针的地址,data是入栈的数据
int pushLinkStack(linkstack_t **ptop, datatype data);
//3.判断栈是否为空
int isEmptyLinkStack(linkstack_t *top);
//4.出栈
datatype popLinkStack(linkstack_t **ptop);
//5.清空栈
void clearLinkStack(linkstack_t **ptop);
//6.求栈的长度
int lengthLinkStack(linkstack_t *top);
//7.获取栈顶数据,不是出栈,不需要移动main函数中的top,所以用一级指针
datatype getTopLinkStack(linkstack_t *top);
#endif

1.创建一个空的栈

void createEmptyLinkStack(linkstack_t **ptop)
{
	*ptop = NULL;
}
  1. 入栈
int pushLinkStack(linkstack_t **ptop, datatype data)
{
	// 定义一个指针pnew,指向新节点
	linkstack_t *pnew = (linkstack_t *)malloc(sizeof(linkstack_t));
	if(pnew == NULL)
	{
		printf("New Node Creation Failed!!\n");
		return -1;
	}
	// 初始化
	pnew->data = data;
	pnew->next = *ptop;	// 新节点的指针域,指向旧节点的地址
	// 栈针移动到最新的节点
	*ptop = pnew;
}
  1. 判断栈是否为空
int isEmptyLinkStack(linkstack_t *top)
{
	// 栈针指向NULL时,栈为空
	return top == NULL;
}
  1. 出栈
datatype popLinkStack(linkstack_t **ptop)
{
	// 容错判断
	if (isEmptyLinkStack)
	{
		printf("Stack is empty!!\n");
		return NULL;
	}
	// 定义指针pdel,指向出栈节点
	linkstack_t* pdel = NULL;
	// 定义中间变量,暂存出栈数据
	datatype data = 0;
	// pdel指向出栈节点
	pdel = *ptop;
	// data暂存出栈数据
	data = pdel->data;
	// 栈针移动,释放出栈节点
	*ptop = (*ptop)->next;
	free(pdel);
	pdel = NULL;
	// 返回出栈数据
	return data;
}
  1. 清空栈
void clearLinkStack(linkstack_t **ptop)
{
	while(!isEmptyLinkStack(*ptop))
	{
		popLinkStack(ptop);
	}
}
  1. 求栈的长度
int lengthLinkStack(linkstack_t *top)
{
	// 定义一个变量,作为长度的计数
	int len = 0;
	// 链式栈长度的计算实际上是无头单向链表的遍历问题
	while(top =  NULL)
	{
		len ++;	// 累计计数
		top = top->next;	// 栈针移动
	}
}
  1. 获取栈顶数据
datatype getTopLinkStack(linkstack_t *top)
{
	// 容错判断
	if (!isEmptyLinkStack(top))
	{
		printf("Stack is empty\n");
		return -1;
	}
	// 返回栈顶数据
		return top->data;
}

5. 队列

5.1. 特性

  1. 一端只能输入,称为队尾;另一端只能输出,称为队头
  2. 先进先出:FIFO
  3. 存在假溢出现象:
    1)当数据存满后,有数据从队头出列后,应该可以存入新的数据,但是因为数据在队列里面不移动,所以队尾不存在空位,新数据无法入列,但是队列未满,如下图
    假溢出现象
    2)解决方法:顺序队列

5.2. 顺序队列(循环队列)

循环队列
需要实现头和尾都可以走完最后一位之后再走回来,比如4->5->0->1。
方法一:

if(i==N)
	i = 0;
else
	i++;

方法二:

i = (i+1)%N;

5.2.1. 代码实现

头文件 sequeue.h

#ifndef __SEQUEUE_H__
#define __SEQUEUE_H__
#define N 6
typedef int datatype;
typedef struct
{
	datatype data[N];//循环队列的数组
	int rear;//存数据端 rear 后面
	int front;//取数据端 front 前面
}sequeue_t;

// 1. 创建一个空的队列
sequeue_t *createEmptySequeue();
// 2. 判断队列是否为满
int isFullSequeue(sequeue_t *p);
// 3. 入列 data代表入列的数据
int inSequeue(sequeue_t *p,datatype data);
// 4. 判断队列是否为空
int isEmptySequeue(sequeue_t *p);
// 5. 出列 
datatype outSequeue(sequeue_t *p);
// 6. 求队列的长度
int lengthSequeue(sequeue_t *p);
// 7. 清空队列函数
void clearSequeue(sequeue_t *p);
#endif
  1. 创建一个空队列
sequeue_t *createEmptySequeue()
{
	// 申请空间存放队列结构
	sequeue_t *p = (sequeue_t *)malloc(sizeof(sequeue_t));
	if(p == NULL)
	{
		printf("Space opening failure !!\n");
		return NULL;
	}
	// 初始化
	p->rear = 0;
	p->front = 0;

	return p;
}
  1. 判断是否为满
int isFullSequeue(sequeue_t *p)
{
	// 循环队列的判满公式
	return p->front == (p->rear + 1) % N;
}
  1. 入列
int inSequeue(sequeue_t *p, datatype data)
{
	// 容错判断
	if( isFullSequeue(p) )
	{
		printf("Space is Full !!\n");
		return -1;
	}
	// 入列
	p->data[p->rear] = data;
	// 队尾向后移动一个数据单位
	p->rear = (p->rear + 1) % N;
	return 0;
}
  1. 判断是否为空
int isEmptySequeue(sequeue_t *p)
{
	// 空返回1,非空返回0
	return p->rear == p->front;
}
  1. 出列
datatype outSequeue(sequeue_t *p)
{
	// 容错判断
	if ( isEmptySequeue(p) )
	{
		printf("Space is empty !!\n");
		return -1;
	}
	// 出列
		// 1)定义一个变量,暂存出列数据
	datatype data = p->data[p->front];
		// 2)队头移动
	p->front = (p->front + 1) % N;
	
	return data;
}
  1. 求队列的长度
int lengthSequeue(sequeue_t *p)
{
	// 队尾可以大于队头,也可以小于队头
	// rear >= front, rear - front 是长度
	// rear < front, rear + N -front ,这种情况相当于,队尾套了队头一圈
	// 两种情况综合之后得到公式 ( rear + N - front ) % N
	return ( p->rear - p->front + N ) % N;
}

+N 之后 %N 对结果来说,相当于没操作

  1. 清空队列函数
void clearSequeue(sequeue_t *p)
{
	// p->front = p->rear;	// 不返回数据
	while(!isEmptySequeue(p))
		outSequeue(p);	// 可以返回出列数据, 看需求
}

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

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

相关文章

LeetCode刷题第7题【整数反转】---解题思路及源码注释

LeetCode刷题第7题【整数反转】—解题思路及源码注释 结果预览 目录 LeetCode刷题第7题【整数反转】---解题思路及源码注释结果预览一、题目描述二、解题思路1、问题理解2、解题思路 三、代码实现及注释1、源码实现2、代码解释 四、执行效果1、时间和空间复杂度分析 一、题目描…

相机闪光灯拍照流程分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、Flash 基础知识二、MTK 闪光灯拍照log分析 一、Flash 基础知识 1.1 Flash HAL 场景枚举值 Flash HAL 场景枚举值 1.2 AE AF mode State 枚举值 AE …

给本地模型“投喂“数据

如何训练本地Deepseek-r1:7b模型 在前面两篇文章中&#xff0c;我在自己的电脑的本地部署了Deepseek的7b的模型&#xff0c;并接入到我Chrome浏览器的插件中&#xff0c;使用起来更方便了。在使用的过程中发现7b的推理能力确实没有671满血版本的能力强&#xff0c;很多问题回答…

大脑网络与智力:基于图神经网络的静息态fMRI数据分析方法|文献速递-医学影像人工智能进展

Title 题目 Brain networks and intelligence: A graph neural network based approach toresting state fMRI data 大脑网络与智力&#xff1a;基于图神经网络的静息态fMRI数据分析方法 01 文献速递介绍 智力是一个复杂的构念&#xff0c;包含了多种认知过程。研究人员通…

原生Three.js 和 Cesium.js 案例 。 智慧城市 数字孪生常用功能列表

对于大多数的开发者来言&#xff0c;看了很多文档可能遇见不到什么有用的&#xff0c;就算有用从文档上看&#xff0c;把代码复制到自己的本地大多数也是不能用的&#xff0c;非常浪费时间和学习成本&#xff0c; 尤其是three.js &#xff0c; cesium.js 这种难度较高&#xff…

学习总结三十二

map #include<iostream> #include<map> using namespace std;int main() {//首先创建一个map对象map<int, char>oneMap;//插入数据oneMap.insert(pair<int, char>(1, A));oneMap.insert(make_pair(2,B));oneMap.insert(map<int,char>::value_ty…

AI如何与DevOps集成,提升软件质量效能

随着技术的不断演进&#xff0c;DevOps和AI的融合成为推动软件开发质量提升的重要力量。传统的DevOps已经为软件交付速度和可靠性打下了坚实的基础&#xff0c;而随着AI技术的加入&#xff0c;DevOps流程不仅能提升效率&#xff0c;还能在质量保障、缺陷预测、自动化测试等方面…

ESP学习-1(MicroPython VSCode开发环境搭建)

下载ESP8266固件&#xff1a;https://micropython.org/download/ESP8266_GENERIC/win电脑&#xff1a;pip install esptools python.exe -m pip install --upgrade pip esptooo.py --port COM5 erase_flash //清除之前的固件 esptool --port COM5 --baud 115200 write_fla…

解决DeepSeek服务器繁忙问题

目录 解决DeepSeek服务器繁忙问题 一、用户端即时优化方案 二、高级技术方案 三、替代方案与平替工具&#xff08;最推荐简单好用&#xff09; 四、系统层建议与官方动态 用加速器本地部署DeepSeek 使用加速器本地部署DeepSeek的完整指南 一、核心原理与工具选择 二、…

在WPS中通过JavaScript宏(JSA)调用本地DeepSeek API优化文档教程

既然我们已经在本地部署了DeepSeek,肯定希望能够利用本地的模型对自己软件开发、办公文档进行优化使用,接下来就先在WPS中通过JavaScript宏(JSA)调用本地DeepSeek API优化文档的教程奉上。 前提: (1)已经部署好了DeepSeek,可以看我的文章:个人windows电脑上安装DeepSe…

CentOS-Stream 9安装

文章目录 1 CentOS9安装引导界面2 CentOS9安装过程2.1 语言选择2.2 安装项选择2.2.1 安装目标位置2.2.2 软件选择2.2.3 网络和主机名2.2.4 root密码2.2.5 创建用户 2.3 开始安装2.4 等待安装成功 3 安装成功 1 CentOS9安装引导界面 选择Install CentOS Stream 9后按Enter键&…

【神经网络框架】非局部神经网络

一、非局部操作的数学定义与理论框架 1.1 非局部操作的通用公式 非局部操作(Non-local Operation)是该研究的核心创新点,其数学定义源自经典计算机视觉中的非局部均值算法(Non-local Means)。在深度神经网络中,非局部操作被形式化为: 其中: 1.2 与传统操作的对比分析…

RAG科普文!检索增强生成的技术全景解析

RAG 相关技术的八个主题&#xff1a;https://pub.towardsai.net/a-taxonomy-of-retrieval-augmented-generation-a39eb2c4e2ab 增强生成 (RAG) 是塑造应用生成式 AI 格局的关键技术。Lewis 等人在其开创性论文中提出了一个新概念面向知识密集型 NLP 任务的检索增强生成之后&…

【做一个微信小程序】校园地图页面实现

前言 上一个教程我们实现了小程序的一些的功能&#xff0c;有背景渐变色&#xff0c;发布功能有的呢&#xff0c;已支持图片上传功能&#xff0c;表情和投票功能开发中&#xff08;请期待&#xff09;。下面是一个更高级的微信小程序实现&#xff0c;包含以下功能&#xff1a;…

STM32G474--Linpack程序移植笔记

1 获取测试程序 直接将该页面的测试程序复制到新建的linpack.c文件中即可。 Linpack测试程序 2 移植程序 2.1 准备基本工程 参考这篇笔记从我的仓库中选择合适的基本工程,进行程序移植。这里我用的是stm32g474的基本工程。 使用git clone一个指定文件或者目录 2.2 在基本…

【2025深度学习系列专栏大纲:深入探索与实践深度学习】

第一部分:深度学习基础篇 第1章:深度学习概览 1.1 深度学习的历史背景与发展轨迹 1.2 深度学习与机器学习、传统人工智能的区别与联系 1.3 深度学习的核心组件与概念解析 神经网络基础 激活函数的作用与类型 损失函数与优化算法的选择 1.4 深度学习框架简介与选择建议 第2…

对PosWiseFFN的改进: MoE、PKM、UltraMem

先从PosWiseFFN说起 class PoswiseFeedForwardNet(nn.Module):def __init__(self):super(PoswiseFeedForwardNet, self).__init__()self.fc nn.Sequential(nn.Linear(d_model, d_ff, biasFalse),nn.GeLU(),nn.Linear(d_ff, d_model, biasFalse))def forward(self, inputs): …

web第三次作业

弹窗案例 1.首页代码 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>综合案例</title><st…

计数排序

目录 计数排序原理和步骤&#xff1a; 完整代码实现&#xff1a; 计数排序原理和步骤&#xff1a; 当一段数据比较集中在一个范围&#xff0c;比如 98&#xff0c;95&#xff0c;98&#xff0c;91&#xff0c;90&#xff0c;93&#xff0c;94&#xff0c;97&#xff0c;93&…

安装OpenXR运行时 微软Windows Mixed Reality的OpenXR

1、下载openxr示例代码 https://github.com/KhronosGroup/OpenXR-SDK-Source.git mkdir build\win64 cd build\win64 2、编译会生成可执行文件 C:\Work\github\OpenXR-SDK-Source\build\win64\src\tests\hello_xr\Debug\hello_xr.exe 执行 C:\Work\github\OpenXR-SDK-Source\b…