初阶数据结构:栈与队列

news2024/12/25 23:41:42

目录

  • 1. 简述:栈
  • 2. 栈的功能分析与实现
    • 2.1 功能分析
    • 2.2 栈的实现
      • 2.2.1 栈的结构创建与初始化
      • 2.2.2 压栈,出栈与判空:
      • 2.2.3 获取栈顶元素,检索栈的长度与栈的销毁
  • 3. 简述:队列
  • 4. 队列的功能分析与实现
    • 4.1 队列的功能分析
    • 4.2 队列的实现
      • 4.2.1 队列的结构与初始化
      • 4.2.2 队列的插入和删除操作
      • 4.2.3 返回队首与队尾元素,计算队列有效元素长度
      • 4.2.4 队列的销毁

1. 简述:栈

  1. 为一种特殊的线性表,它只允许在指定的一端进行数据的插入和删除操作。被指定进行插入和删除操作的一端被称为栈顶,另一端,被称为栈底,其遵循着数据的先进后出原则。
  2. 压栈:栈插入数据的操作被称为进栈,压栈等
  3. 出栈:栈的删除操作被称为出栈。

在这里插入图片描述

2. 栈的功能分析与实现

2.1 功能分析

  1. 栈的创建与初始化:stackinit
  2. 栈的插入与删除操作:stackpush,stackpop
  3. 获取栈顶元素与检测栈中的有效元素个数:stacktop,stacksize
  4. 栈的判空与销毁:stackempty,stackdestroy

2.2 栈的实现

2.2.1 栈的结构创建与初始化

静态栈与动态栈:

  1. 静态栈:在定义初始化就指定了栈的大小,容量不可根据所需动态增长
  2. 动态栈:会根据存储数据的增多不断扩大自身的容量

注:动态栈更具有学习与应用意义,以下内容都默认为动态栈

栈的结构:

补充:栈的数据结构只对逻辑上有要求,必须满足元素的先进后出与栈顶,栈底的逻辑结构。因此,具体实现时使用数组或链表都可,数组的结构方便实现与适合栈。(数组栈

//静态栈
typedef int STDataType;
#define N 10
typedef struct Stack
{
	STDataType _a[N];
	int _top; // 栈顶
}Stack;

// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{
	STDataType* _a;
	int _top; // 栈顶
	int _capacity; // 容量
}Stack;

栈的扩容与初始化:

//扩容
void CheckCapacity(Stack* ps)
{
	if (ps->_capacity == ps->_top)
	{
		int newcapacity = ps->_capacity == 0 ? 4 : 2 * ps->_capacity;
		STDataType* data = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));
		if (data == NULL)
		{
			perror("realloc failed");
			exit(-1);
		}

		ps->_a = data;
		ps->_capacity = newcapacity;
	}
}

//初始化
void StackInit(Stack* ps)
{
	ps->_capacity = 0;
	ps->_top = 0;
	ps->_a = NULL;

	CheckCapacity(ps);
}

2.2.2 压栈,出栈与判空:

//压栈
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	
	CheckCapacity(ps);
	ps->_a[ps->_top] = data;
	ps->_top++;
}

//判空
int StackEmpty(Stack* ps)
{
	assert(ps);

	return ps->_top == 0;
}

//出栈
void StackPop(Stack* ps)
{
	assert(!StackEmpty(ps));

	ps->_top--;
}

2.2.3 获取栈顶元素,检索栈的长度与栈的销毁

//获取栈顶元素
STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));

	return ps->_a[ps->_top - 1];
}

//检索栈的长度
int StackSize(Stack* ps)
{
	assert(ps);

	return ps->_top;
}

//销毁栈
void StackDestroy(Stack* ps)
{
	assert(ps);

	free(ps->_a);
	ps->_capacity = ps->_top = 0;
}

3. 简述:队列

队列为一种只允许在一端插入数据,在另一端删除数据的特殊线性表,其遵循着先进先出的原则。进行插入操作的一侧被称为队尾,进行删除操作的一侧被称为队首

在这里插入图片描述

4. 队列的功能分析与实现

4.1 队列的功能分析

  1. 队列的结构与初始化:queueinit
  2. 队列的插入与删除操作:queuepush,queuepop
  3. 获取队尾与队头元素:queuefront,qeueuback
  4. 获取队列中有效元素个数:queuesize
  5. 队列判空与销毁:queueempty,queuedestroy

4.2 队列的实现

4.2.1 队列的结构与初始化

注:因为队列的删除操作为头删,所以此处采用头删更为方便的链式结构:链表。

队列的结构:

typedef int QDataType;

//队列结点
typedef struct QListNode
{
	struct QListNode* _pNext;
	QDataType _data;
}QNode;

// 队列的结构(队列的头尾)
typedef struct Queue
{
	QNode* _front;
	QNode* _rear;
}Queue;

队列的初始化:

void QueueInit(Queue* q)
{
	assert(q);

	q->_front = q->_rear = NULL;
}

4.2.2 队列的插入和删除操作

创建新结点与插入操作:

//结点申请
QNode* BuyNewNode2(QDataType data)
{
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc failed");
		exit(-1);
	}

	newnode->_data = data;
	newnode->_pNext = NULL;

	return newnode;
}

//插入
void QueuePush(Queue* q, QDataType data)
{
	assert(q);

	QNode* newnode = BuyNewNode2(data);
	if (q->_front == NULL)
	{
		q->_front = q->_rear = newnode;
	}
	else
	{
		q->_rear->_pNext = newnode;
		q->_rear = q->_rear->_pNext;
	}
}

判空与删除操作:

//判空
int QueueEmpty(Queue* q)
{
	assert(q);

	return q->_front == NULL;
}

//删除
void QueuePop(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));

	QNode* cur = q->_front->_pNext;
	free(q->_front);
	q->_front = cur;

	if (q->_front == NULL)
	{
		q->_rear = NULL;
	}
}

4.2.3 返回队首与队尾元素,计算队列有效元素长度

//返回队头元素
QDataType QueueFront(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));

	return q->_front->_data;
}

//返回队尾元素
QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));

	return q->_rear->_data;
}

//返回队列有效长度
int QueueSize(Queue* q)
{
	assert(q);

	int count = 0;
	QNode* cur = q->_front;
	while (cur)
	{
		cur = cur->_pNext;
		count++;
	}

	return count;
}

4.2.4 队列的销毁

void QueueDestroy(Queue* q)
{
	assert(q);

	while (q->_front)
	{
		QueuePop(q);
	}
}

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

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

相关文章

基于springboot+vue的美食推荐商城

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

重塑计算:ICP 打造无限智能合约云解决方案

作者:Lynn Cadet 编译:TinTinLand 原文:https://www.hostingadvice.com/blog/internet-computer-offers-a-limitless-smart-contract-cloud-solution/ 摘要:与其前身互联网一样,区块链行业寻求引领一个新时代及其经济…

腾讯云优惠券一共有3个渠道可以领取,你知道吗?

腾讯云代金券领取渠道有哪些?腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券,大家也可以在腾讯云百科蹲守代金券,因为腾讯云代金券领取渠道比较分散,腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

Ubuntu22.04下安装Spark2.4.0(Local模式)

一、版本信息 虚拟机产品:VMware Workstation 17 Pro 虚拟机版本:17.0.0 build-20800274 ISO映像文件:ubuntukylin-22.04-pro-amd64.iso Hadoop版本:Hadoop 3.1.3 JDK版本:Java JDK 1.8 Spark版本:S…

1905_ARMv7-M的堆栈寄存器

1905_ARMv7-M的堆栈寄存器 全部学习汇总: g_arm_cores: ARM内核的学习笔记 (gitee.com) ARMv7-M实现了2种堆栈,分别是MSP和PSP。复位的时候默认是MSP,而当前是哪种可以通过CONTROL.SPSEL寄存器的bit来查看。 SP寄存器的最低2bit,S…

叠氮生物素,Biotin-azide ,含有生物素基团和叠氮基团

您好,欢迎来到新研之家 文章关键词:生物素-叠氮,生物素叠氮,叠氮生物素,Biotin-azide ,Azide-Biotin,Biotin-N3,N3-Biotin,908007-17-0 一、基本信息 【产品简介】&a…

根据二层封装协议决定—网络类型

目录 一、网络类型的分类 二、数据链路层协议 MA网络 以太网协议 P2P网络 一、网络类型的分类 P2P --- point to point --- 点到点网络 MA --- Multi-Access Network --- 多点接入网络 BMA --- Broadcast Multi-Access Network --- 广播型多点接入网络 NBMA --- Non-Bro…

如何更好的引导大语言模型进行编程的高效开发流程?

这张图片展示了一种如何更好地引导大语言模型进行编程的方法。 首先,最简单也是最有效的方法是让大语言模型重复运行多次,每次增加一些额外的信息,直到获得想要的结果。这种方法虽然简单,但可能需要多次尝试才能得到满意的结果。…

AI搜索工具颠覆百度搜索,直接给出结果

这可能是一款足够颠覆搜索引擎的AI工具,绝对是AI产品中的国货之光。 它就是秘塔AI搜索,主打的亮点就是没有广告,我们进入官网之后,可以在对话框输入我们想要了解的事件。 比如最近比较热门的是中国AI教父李一舟,它会执…

netlink原理及应用

什么是netlink netlink是一种基于网络的通信机制,允许内核内部、内核与用户态应用之间甚至用户态应用之间进行通信;netlink的主要作用是内核与用户态之间通信;它的思想是,基于BSD的socket使用网络框架在内核和用户态之间进行通信…

Python算法题集_括号生成

Python算法题集_括号生成 题22:括号生成1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【堆栈回溯】2) 改进版一【切片回溯】3) 改进版二【列表缓存逐层扩充】 4. 最优算法5. 相关资源 本文为Python算法题集之一的代码示例 题22&am…

#单片机(TB6600驱动42步进电机)

1.IDE:keil 2.设备:保密 3.实验:使用单片机通过普通IO口控制TB6600驱动42步进电机 4.时序图: TB6600 ENA、ENA-DIR-、DIRPUL-、PULB-、BA、A-VCC、GND使能电机(直接悬空不接)方向脉冲输入(普通IO口模拟即可&#xff…

回归啦!!!

消失的日子在实习,今天最后一天了来看看自己的学习日志,有没有可以和小伙伴交流的部分吧! 目录 一、产品one ①简介 ②底层原理 ③知识点一 作用一:日志采集 作用二:实时监测 作用三:规则匹配 作用…

足底筋膜炎的症状及治疗

足底筋膜炎症状:足底筋膜炎通常表现为足跟部疼痛,尤其是在晨起或长时间站立、行走后加重。疼痛可能向足底前部或足弓处放射,严重时可能影响行走。此外,患者还可能出现足跟部肿胀、皮肤温度升高、局部压痛等症状。 足底筋膜炎治疗方…

WinForm、Wpf自动升级 AutoUpdater.NET

Github AutoUpdater.NET 目录 一、IIS部署 更新站点 二、创建Winform 一、IIS部署 更新站点 IIS默认站点目录下创建 目录 Downloads、Updates Updates目录创建文件 UpdateLog.html、AutoUpdaterStarter.xml UpdateLog.html&#xff1a; <html><body><h1…

FPGA开源项目分享——2D N-Body重力模拟器

​导语 今天继续康奈尔大学FPGA 课程ECE 5760的典型案例分享——2D N-Body重力模拟器。 &#xff08;更多其他案例请参考网站&#xff1a; Final Projects ECE 5760&#xff09; 1. 项目概述 项目网址 Grav Sim 项目说明 该项目的目标是创建一个用DE1-SOC进行硬件加速的2…

FPGA-VGA成像原理与时序

什么是VGA: VGA, Video Graphics Array。即视频图形阵列,具有分辨率高、显示速率快、颜色丰富等优点。VGA接口不但是CRT显示设备的标准接口,同样也是LCD液晶显示设备的标准接口,具有广泛的应用范围。在FGPA中,常广泛用于图像处理等领域。 VGA 显示器成像原理 在 VGA 标准刚兴…

YOLO算法改进Backbone系列之:PVTv2

摘要&#xff1a;最近&#xff0c;Transformer在计算机视觉方面取得了令人鼓舞的进展。在本研究中&#xff0c;本文通过增加(1)线性复杂度注意层、(2)重叠贴片嵌入和(3)卷积前馈网络三种设计&#xff0c;改进了原始的金字塔视觉转换器(PVT v1)&#xff0c;提出了新的基线。通过…

机器学习笔记 YOLOv9模型相关论文简读

一、YOLOv9简述 自 2015 年 Yolov1 推出以来,已经出现了多个版本。 基于Darknet的YOLOv2、YOLOv3和YOLOv4 YOLOv5 YOLOv8 基于 Ultralytics。 SCALED-YOLOv4 使用 Pytorch 而不是 Darknet。 YOLOR是YOLOv4的改进。 YOLOX是YOLOv3的改进。 YOLOv6专注于工业应用。 YOLOv7 来自 …

iOS消息转发流程

当向Objc对象发送消息时&#xff0c;如果找到对象对应的方法&#xff0c;就会进入消息转发流程&#xff0c;给开发者提供一些最后的机会处理消息无法发送问题&#xff0c;以免出现程序崩溃。 1. 回调对象的resolveInstanceMethod方法&#xff0c;在这个方法中&#xff0c;允许开…