栈和队列的实现

news2024/10/7 2:27:53

栈的概念

栈也是线性表的一种,但是栈只允许在固定的一端进行插入与删除数据,而进行插入与删除的一端同意称为栈顶,而另一端就称为栈底。简称:后进先出

压栈(push):将数据插入栈顶。

出栈(pop):将栈顶的数据删除。

栈的实现

 栈的存储与删除数据的形式是:后进先出。所以这就很符合顺序表的实现模式,可以快速的找到最后一个元素。如果用单链表的话就需要遍历显得比较复杂,但是将单链表的栈顶与栈底换一下也显得比较容易了。

需要实现的函数

typedef struct stack
{
	int* arr;//指向动态开辟的空间
	int top;//指向栈顶数据的下一个空间(表示实际数据个数)
	int capacity;//开辟空间的容量大小

}St;

void Inite(St* ps);//初始化
void Push(St* ps,int x);//压栈
void Pop(St* ps);//出栈
void Destroy(St* ps);//释放空间
int Top(St* ps);//返回栈顶元素

void Inite(St* ps)
{
	ps->arr = NULL;
	ps->capacity = 0;//容量大小
	ps->top = 0;//栈中存储元素个数

}

void Push(St* ps,int x)
{
	if (ps->capacity == ps->top)//判断容量是否足够
	{
		ps->capacity = ps->capacity == 0 ? 3 : 2 * ps->capacity;
		int* new = (int*)realloc(ps->arr,ps->capacity*sizeof(int));当ps->arr为空时realloc就相当于malloc
		if (new == NULL)
		{ 
			perror("realloc false:");
			return;
		}
		ps->arr = new;
		 
	}
	ps->arr[ps->top] = x;
	ps->top++;
}

void Pop(St* ps)//删除数据要考虑是否存在数据
{
	assert(ps->top);//ps->top为假就跳出
	ps->top--;

}

int Top(St* ps)
{
	assert(ps->top);//无数据时就跳出
	return ps->arr[ps->top-1];//top-1是栈顶的元素
}

void Destroy(St* ps)
{
	free(ps->arr);//free的对象是动态开辟的空间
	ps->capacity = ps->top = 0;
	ps->arr = NULL;
}

队列

队列的概念

队列同样也是线性表的一种,队列就像食堂打饭一样,前面的打好饭先走,新来的同学站在后面排队。即:只允许在一端进行插入数据,而另一端进行删除数据。

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

队列的实现 

队列是在对头删除数据,队尾插入数据,如果再用线性表来实现的话就会发生挪动数据的现象,效率会降低,所以我们选择更简便的方法,单链表实现队列。但是既然是尾入头删的模式,所以我们为了避免每次插入数据是找尾,所以我们每次插入数据的时候都记录上尾的位置就显得更容易了。

实现前的基本操作

typedef struct QueueNode//每个节点所具备的结构(多个节点)
{
	int val;
	struct Node* next;
}QNode;

typedef struct Queue//(只有一个)可以避免使用二级指针
{
	QNode* head;//记录节点头
	QNode* tail;//记录节点尾
	int size;//记录节点个数
}Que;

这里创建两个结构体,一个是节点结构体,而我们既然又要记录尾的位置还要保存头的位置,所以我们又可以将这几个数据放在同一个结构体里,这里不仅仅在函数传参时方便了很多,而且不需要用到二级指针,所以我们每次传参时,传队列创建的变量地址就可以了。

函数的实现

void Init(Que* q);// 初始化队列

void Push(Que* q, int data);// 队尾入队列

void Pop(Que* q);// 队头出队列

int GetFront(Que* q);// 获取队列头部元素

int GetBack(Que* q);// 获取队列队尾元素

int Size(Que* q);// 获取队列中有效元素个数

void Destroy(Que* q);// 销毁队列

QNode* Malloc(int data)//创建节点
{
	QNode* new = (QNode*)malloc(sizeof(QNode));
	if (new == NULL)
	{
		perror("malloc false");
		return;
	}
	new->val = data;
	new->next = NULL;
}

void Init(Que* q)// 初始化队列
{
	q->head = NULL;
	q->size = 0;
	q->tail = NULL;

}
void Push(Que* q, int data)// 队尾入队列
{
	QNode* new =Malloc(data);
	assert(new);
	if (q->head == NULL)
	{
		q->head = q->tail = new;
	}
	else
	{
		q->tail->next = new;
		q->tail = new;//指向最后一个节点
	}
	q->size++;//勿忘
}

void Pop(Que* q)// 队头出队列
{

    //删除数据之前一定要判断数据是否为空
	assert(q->head);
	QNode* next = q->head->next;
	if (q->size == 1)//只有一个有效数据时要判断,防止q->tail成为野指针
	{
		free(q->head);
		q->head = q->tail = NULL;
	}
	else
	{
		free(q->head);
		q->head = next;
	}
	q->size--;//勿忘

}

int GetFront(Que* q)// 获取队列头部元素
{
	return q->head->val;
}

int GetBack(Que* q)// 获取队列队尾元素
{
	return q->tail->val;
}

int Size(Que* q)// 获取队列中有效元素个数
{
	return q->size;
}

void Destroy(Que* q)// 销毁队列
{
	QNode* cur = q->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	q->head = q->tail = NULL;
	q->size = 0;
}


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

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

相关文章

C++进阶——AVL树的构建

C进阶——AVL树的构建 AVL树 概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当 于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landi…

2023Python最火的第三方开源测试框架 ——pytest

一、介绍 本篇文章是介绍的是Python 世界中最火的第三方单元测试框架:pytest。 它有如下主要特性: assert 断言失败时输出详细信息(再也不用去记忆 self.assert* 名称了)自动发现测试模块和函数模块化夹具用以管理各类测试资源对…

顺序表,让数据有序飞舞:C语言实现全攻略

本篇博客会讲解顺序表这种数据结构的相关知识,并且使用C语言实现一个顺序表。 概述 什么是顺序表呢?顺序表是一种线性的数据结构,其特点是:数据是从第一个位置开始,连续存放的。其实,你完全可以把它等价于…

哈工大软件过程与工具作业3

哈尔滨工业大学 计算学部/软件学院 2022年秋季学期 2020级本科《软件过程与工具》课程(3.0学分) 作业报告 作业3:软件测试报告 姓名 学号 联系方式 石卓凡 120L021011 944613709qq.com/18974330318 目 录 1 作业目的与要求...........…

《计算机网络—自顶向下方法》 Wireshark实验(七):以太网与ARP协议分析

1 以太网 1.1 介绍 以太网是现实世界中最普遍的一种计算机网络。以太网有两类:第一类是经典以太网,第二类是交换式以太网,使用了一种称为交换机的设备连接不同的计算机。 经典以太网:是以太网的原始形式,运行速度从 …

股价与期待值“背道而驰”,友车科技能否站稳科创板?

上周,共计7只新股登陆A股,其中,用友汽车信息科技(上海)股份有限公司(以下简称友车科技)于5月11日在科创板上市。发行价为33.99元,发行3607.94万股,募资总额为12.24亿元。…

jmeter接口测试项目实战详解,零基础也能学,源码框架都给你

目录 1.什么是jmeter? 2.jmeter能做什么? 3.jmeter环境搭建 3.1前提: 3.2jmeter下载: 3.3jmeter环境搭建: 3.3.1mac当中jmeter环境搭建: 3.4jmeter基本配置 3.4.1.切换语言 3.4.2.安装插件 4.jmet…

MySQL数据库基础2

文章目录 数据类型表的约束 数据类型 1、数值类型:BIT、TINYINT、BOOL、SMALLINT、INT、BIGINT、FLOAT[(M,D)]、DOUBLE[(M,D)]、DECIMAL[(M,D)] FLOAT[(M,D)]:占用四个字节,M表示显示位数,D表示小数位数,精度保证&am…

5年测试,已失业3个月.....

我做测试5年,一线城市薪水拿到15K,中间还修了一个专升本,这个年限不说资深肯定也是配得上经验丰富的。今年行情不好人尽皆知,但我还是对我的薪水不是很满意,于是打算出去面试,希望可以搏一个高薪。 但真到面…

测试自动化工具_Katalon

测试自动化_Katalon 1.概述 ​ Katalon界面的自动化测试工具,简称KS,于2015年推出。是开源的,提供的版本有免费的版本,还有企业版是收费的。如下图。其中的服务台功能应该是持续继承的支持。可试用一个月。 ​ 最初是支持Web UI…

Chatgpt论文笔记——MiNiGPT4解读

前言 代码地址:https://github.com/Vision-CAIR/MiniGPT-4 摘要 摘要写的就很简单了,标黄的是重点,可以看到这个方法很简单,就是拿了一个视觉的encoder(Blip-2)以及拿了一个文本的encoder(Vic…

OpenPCDet系列 | 5.2 PointPillars算法——PointPillarScatter伪图像BEV特征构建模块

文章目录 PointPillarScatter模块1. PointPillarScatter初始化2. PointPillarScatter前向传播 OpenPCDet的整个结构图: PointPillarScatter模块 在进行了PillarVFE编码后,此时的batch_dict更新如下所示,追加了pillar_features字段&#xf…

好程序员:转行学Java怎么样?什么工作可以月入过万?

去年的时候有个学妹跟小源说,想转行,但是目前又比较迷茫,不知道该从事啥行业?她跟小源说了下具体情况,本科学历,Java零基础。小源让好程序员的就业老师跟她分享了下相关的it行业规划,最后她学了…

Python实现ACO蚁群优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

关于摄影艺术欣赏分享(私密空间+玛丽娜·阿布拉莫维奇+世界十大最昂贵的摄影作品欣赏+《死亡路上的对话》+马良作品)

文章的内容灵感是旁听课而来的呀,搜了很多相关文章很喜欢 1. 出去遛狗,晚点回来 国外文化中国文化(国外不可以随意拍摄照片) 公共空间私密空间 艺术的价值在于可以给人们思考,颠覆常识 2. 行为艺术之母玛丽娜阿布拉…

YOLOv5【目录结构源码】超详细注释解读!!!建议收藏✨✨!

上一篇文章介绍了YOLOv5的网络的详细解读:直通车🚀 由于以后的学习及在进行的项目打算YOLOv5再仔细研究进行使用及改进,接下来会出相关于YOLOv5的代码逐行解读以及注释,废话不多说,让我们一起学习YOLOv5源码吧&#xf…

CTFshow pwn03

题目: 在做本道题前,我们先了解所必要的知识 Libc是什么? 英文名字:Standard C library,其翻译过来,C语言标准库 它是符合ANSI C标准的一个函数库 学过C语言会明白 ANSI C标准又是什么? 198…

Redo log

目录标题 前言为什么需要redo log redo log中的WAL(先写日志,再写磁盘)重要参数innodb_flush_log_at_trx_commit如何选择 redo log记录形式日志块(log block)redo log的格式 redo log何时刷入磁盘正常关闭服务器时事务提交时(inno…

【STL】string的使用

放在专栏【C知识总结】,会持续更新,期待支持🌹 STL简介 STL的诞生 STL为英文Standard Template Library的缩写,译为标准模板库。是C标准库的重要组成部分。 长久以来,软件届一直希望建立一种可重复运用的东西。所谓…

首个支持RWA交易的订单簿DEX-PoseiSwap,即将开启IEO

随着 DeFi 世界的发展,越来越多的链上协议支持以合成资产的方式,将传统金融资产以加密资产的形式映射至链上,包括美股、黄金期货等等,虽然这种方式进一步帮助投资者,以非许可的形式丰富了投资标的,但这种方…