进来一起把【数据结构】的【栈与队列】狠狠玩弄,痛快到大汗淋漓

news2024/12/22 19:10:25

1前言:顾名思义,栈与队列是两个东西,栈和队列!对的,栈和队列!!,没错,在念一遍,【栈】     和   【队列】!!!但是本质都是差不多的,只不过底层实现的方式不太一样。

这次从简单的入手

栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作 的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原则。

压栈:栈的插⼊操作叫做进栈/压栈/⼊栈,⼊数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。 栈 底层结构选型 栈的实现⼀般可以使⽤数组或者链表实现,相对⽽⾔数组的结构实现更优⼀些。因为数组在尾上插⼊ 数据的代价⽐较⼩。

 

栈的实现

#pragma once
#pragma once

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

//定义栈的结构
typedef int STDataType;
typedef struct Stack
{
	STDataType* arr;
	int capacity;     //栈的空间大小
	int top;          //栈顶
}ST;

void STInit(ST* ps);
void STDestroy(ST* ps);

//栈顶---入数据、出数据
void StackPush(ST* ps, STDataType x);
void StackPop(ST* ps);

//取栈顶元素
STDataType StackTop(ST* ps);

bool StackEmpty(ST* ps);

//获取栈中有效元素个数
int STSize(ST* ps);

 具体实现

初始化
void STInit(ST* ps)
{
	assert(ps);
	ps->arr = NULL;
	ps->capacity = ps->top = 0;
}
销毁栈
void STDestroy(ST* ps)
{
	assert(ps);
	if (ps->arr)
		free(ps->arr);
	ps->arr = NULL;
	ps->top = ps->capacity = 0;
}
入数据
void StackPush(ST* ps, STDataType x)
{
	assert(ps);

	//1.判断空间是否足够
	if (ps->capacity == ps->top)
	{
		int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail!");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = newCapacity;
	}
	//空间足够
	ps->arr[ps->top++] = x;
}
bool StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}
出数据
void StackPop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	--ps->top;
}
取栈顶元素
STDataType StackTop(ST* ps)
{

	assert(ps);
	assert(!StackEmpty(ps));

	return ps->arr[ps->top - 1];
}
获取栈中有效数据
int STSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

 队列

概念:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先 出FIFO(First In First Out)

 ⼊队列:进⾏插⼊操作的⼀端称为队尾

出队列:进⾏删除操作的⼀端称为队头

队列实现 

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

//定义队列结构
typedef int QDataType;
typedef struct QueueNode
{
	QDataType data;
	struct QueueNode* next;
}QueueNode;

typedef struct Queue
{
	QueueNode* phead;
	QueueNode* ptail;
	int size;//保存队列有效数据个数
}Queue;

void QueueInit(Queue* pq);
// ⼊队列,队尾
void QueuePush(Queue* pq, QDataType x);
// 出队列,队头
void QueuePop(Queue* pq);

//队列判空
bool QueueEmpty(Queue* pq);

//取队头数据
int QueueFront(Queue* pq);
//取队尾数据
int QueueBack(Queue* pq);
//队列有效元素个数
int QueueSize(Queue* pq);

//销毁队列
void QueueDestroy(Queue* pq);

具体实现 

 初始化
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}
入队列
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	//申请新节点
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode == NULL)
	{
		perror("malloc fail!");
		exit(1);
	}
	newnode->data = x;
	newnode->next = NULL;

	//ptail newnode
	if (pq->phead == NULL)
	{//队列为空
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		//队列不为空
		pq->ptail->next = newnode;
		pq->ptail = pq->ptail->next;//newnode
	}
	pq->size++;
}
出队列
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	//只有一个结点的情况,避免ptail变成野指针
	if (pq->ptail == pq->phead)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	else
	{
		//删除队头元素、
		QueueNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
	--pq->size;
}
取队头数据
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->phead->data;
}
 取队尾数据
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->ptail->data;
}
队列有效元素个数
int QueueSize(Queue* pq)
{
	assert(pq);
	/*int size = 0;
	QueueNode* pcur = pq->phead;
	while (pcur)
	{
		size++ ;
		pcur = pcur->next;
	}
	return size;*/
	return pq->size;
}
销毁队列
void QueueDestroy(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	QueueNode* pcur = pq->phead;
	while (pcur)
	{
		QueueNode* next = pcur->next;
		free(pcur);
		pcur = next;
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

 

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

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

相关文章

Docker 部署 Mysql (图文并茂超详细)

部署 MYSQL ( Docker ) [Step 1] : 拉取 MYSQL 镜像 docker pull mysql:8.0.33[Step 2] : 创建 MYSQL 相关目录 ➡️ 启动 MYSQL 容器 ➡️ 拷贝文件 ➡️ 授权文件夹 ➡️ 删除容器 # 创建 MYSQL 相关目录 mkdir -p /data/mysql/{conf,log,data}# 启动 MYSQL 容器 docker r…

MES系统:优化生产流程,产品质量与追溯性

MES系统&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;在实现产品质量管理方面发挥着重要作用。它通过集成生产过程的各种数据和功能&#xff0c;帮助企业提升产品质量、降低不良率&#xff0c;并确保生产过程的稳定性和一致性。以下是万界星…

开源云原生数据库PolarDB PostgreSQL 15兼容版本正式发布

开源云原生数据库PolarDB PostgreSQL 15兼容版正式发布上线&#xff0c;该版本100%兼容开源PostgreSQL 15。PolarDB是阿里云自研云原生关系型数据库&#xff0c;基于共享存储的存算分离架构使其具备灵活弹性和高性价比的特性&#xff0c;在开源PostgreSQL很好的性能表现的基础上…

AI绘画界的赛博佛祖,开源最强SD3它来了!(整合包)

前言 全网期待已久的SD3终于和大家见面了。这款以Stable Diffusion为基础&#xff0c;进一步优化和升级的模型&#xff0c;无疑将会深刻地又又又一次改变AI绘画界&#xff01; 这次发布的是Medium版本&#xff0c;在多个方面展现出惊人的能力和效率&#xff0c;堪称开源最强&…

多线程篇(可见性 原子性 有序性(有序性))(持续更新迭代)

目录 一、指令重排序&#xff08;并发编程之美&#xff09; 二、指令重排序&#xff08;百度&#xff09; 1. 为什么需要指令重排序 2. 什么是指令重排序 3. 指令重排序分类 3.1. 编译器优化重排序 3.2. 指令级并行的重排序 3.3. 内存系统的重排 4. 指令重排序规范 4…

【AI工作流】未来的我将何去何从?亲身感受!

在这个瞬息万变的科技时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为推动各行各业变革的核心动力。随着AI技术的不断进步&#xff0c;工作流程的智能化正在悄然改变我们的生活和工作方式。那么&#xff0c;未来的我将何去何从&#xff1f;这是一个值得深思的问题…

揭秘!焦虑症背后的隐形推手:气血不足,你了解多少?

在这个快节奏、高压力的时代&#xff0c;焦虑症似乎成了许多人心头挥之不去的阴霾。失眠、心悸、易怒、持续担忧……这些症状不仅影响着我们的生活质量&#xff0c;更在无形中侵蚀着我们的身心健康。然而&#xff0c;你是否知道&#xff0c;这些看似心理层面的困扰&#xff0c;…

springboot高校实验室教学管理系统的设计和实现

基于springbootvue高校实验室教学管理系统的设计和实现(源码L文ppt)4-045 4 系统总体设计 此次高校实验室教学管理系统通过springboot框架。springboot适合快速构建Web应用。springboot将B/S设计模式中的视图分成了View模块和Template模块两部分&#xff0c;将动态的逻辑处理…

如何获取本地时区名称:JavaScript 实用技巧

如何获取本地时区名称&#xff1a;JavaScript 实用技巧 在现代 web 开发中&#xff0c;处理日期和时间是一个常见的需求。尤其是在涉及到用户的本地时间时&#xff0c;正确获取时区信息显得尤为重要。在这篇博客中&#xff0c;我们将探讨如何使用 JavaScript 获取本地时区名称…

数学基础(四)

一、特征值与特征向量 特征空间&#xff1a; 特征向量的应用&#xff1a; 特征值表达了重要程度且和特征向量所对应&#xff0c;那么特征值大的就是主要信息了&#xff0c;基于这点我们可以提供各种有价值的信息。 二、SVD矩阵分解 基变换&#xff1a; 特征值分解&#xff…

红黑树的插入 C++

红黑树与二叉搜索树类似 它在每个节点增加了一个存储位记录节点的颜色&#xff0c;可以是RED,也可以是BLACK&#xff1b;通过任意一条从根到叶子简单路径上颜色的约束&#xff0c;红黑树保证最长路径不超过最短路径的二倍&#xff0c;因而近似平衡&#xff08;最短路径就是全黑…

zlib压缩解压文件

zlib_utils.h #pragma once#include <Windows.h> #include <tchar.h>// 压缩文件 BOOL CompressFile(LPCTSTR lpSrcFileName, // 输入文件LPCTSTR lpDestFileName // 输出文件 );// 解压缩文件 BOOL UncompressFile(LPCTSTR lp…

在BrowserStack上进行自动化爬虫测试的终极指南

一、背景介绍 随着互联网的快速发展&#xff0c;数据变得越来越宝贵&#xff0c;爬虫技术已成为从网页中提取信息的重要工具。然而&#xff0c;在不同的环境中测试和运行爬虫脚本可能会带来挑战。尤其是在多浏览器、多平台的环境中确保爬虫的稳定性和兼容性是一个令人头疼的问…

GB/T28181和JT1078哪个更先进?

上篇blog我们探讨到GB/T28181规范和JT1078区别和各自应用场景&#xff0c;如果非要比较GB/T28181和JT1078哪个更先进&#xff0c;我们可以从二者更适合哪一类场景&#xff0c;包括规范的设计目标、功能特性、应用场景、技术发展趋势来做个探讨。 GB/T28181 GB/T28181&#xf…

电脑浏览器显示代理服务器拒绝连接的解决办法

问题&#xff1a; 打开电脑浏览器显示代理服务器拒绝连接 解决办法&#xff1a; 1、按住winq键&#xff0c;输入代理&#xff0c;出现更改代理设置 2、将下面的自动检测设置、使用设置脚本、使用代理服务器都设置为关闭&#xff0c;刷新网页即可

【Centos】绕开报错ModuleNotFoundError: No module named ‘dnf‘

问题原因&#xff1a; 安装python3.9后不能使用yum Traceback (most recent call last):File "/usr/bin/yum", line 57, in <module>from dnf.cli import main ModuleNotFoundError: No module named dnf绕开yum解决方法&#xff1a; 直接下载相关依赖包 htt…

性能优化:自动化处理系统设计

性能优化&#xff1a;自动化处理系统设计 前言需求分析系统设计1. 调度中心2. 任务执行器3. 错误处理机制4. 通知系统5. 报表生成器6. 日志记录器 技术实现结语 前言 在当今这个信息爆炸、技术日新月异的时代&#xff0c;企业面临着前所未有的挑战和机遇。随着业务量的不断增长…

ssm基于微信小程序的校园商铺系统论文源码调试讲解

第二章 系统实现的技术支持 2.1微信小程序框架 微信小程序的开发框架是微信所独有的一套框架&#xff0c;分为View视图层和App Service逻辑层两部分。框架提供了一种类似于Web中html语言的wxml语言&#xff0c;作为视图层的标签语言&#xff0c;用于构造页面的布局。另外提供了…

公式编辑支持SUBSTITUTE()函数

08/21 主要更新模块概览 条件展示 精准搜索 新增函数 有效时长 01 表单管理 1.1 【表单查询外链】-新增条件为空时不展示数据 说明&#xff1a; 之前表单查询外链&#xff0c;当查询外链的条件为空时&#xff0c;数据会全部展示。现在&#xff0c;我们新…

NetApp数据恢复—WAFL文件系统误删除的数据恢复案例

NetApp存储故障&#xff1a; 一台NetApp存储配置24块磁盘。管理员几个月之前删除一个文件夹&#xff0c;后期发现这个文件夹中的数据很重要&#xff0c;需要恢复。 根据NetApp文件系统WAFL的特性&#xff0c;新写入数据覆盖之前的数据的可能性不大&#xff0c;可以尝试恢复这个…