栈和队列的实现

目录

1.栈

1.1栈的概念以及结构:

1.2栈的实现

栈的初始化:

栈的销毁:

入栈:

获取栈顶数据:

判空:

获取元素的个数:

2.队列

2.1队列的概念及其结构

2.2队列的实现

队列的初始化

队列的销毁

入队

出队

获取队头数据

获取队尾数据

获取队列元素个数

判空


我们之前讲过了顺序表和链表,今天我们就来学习新的数据结构:栈和队列。

1.栈

1.1栈的概念以及结构:

栈:栈是一种特殊的线性表,它只允许在固定的一端进行数据的插入和删除。进行数据插入和删除的一端叫做栈顶,另一端叫做栈底。也就是说栈中的数据遵循后进先出的规则。

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

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

就像枪械的弹匣一样:

先装进去的子弹被后来装进去的子弹压进去了下端,射击时也是后装进的子弹先发射出去,最先装进去的子弹最后出去。跟数据进栈出栈一模一样。

上图模拟实现了栈进出数据的大致过程。

进栈示意图:

出栈示意图:

了解了进栈出栈的过程后,我们接下来就开始进行栈的实现。

1.2栈的实现

栈的实现一般来说可以使用数组或者链表,相对来说用数组实现更加好一些。

因为数组可以直接通过下标来访问数组中的各个位置的数据,而链表的话代价就比较大一些,因为链表不能通过下标访问元素,只能通过遍历链表通过节点的next或prev指针来找下一个或者上一个节点。

所以我们这次就通过数组来实现栈。

话不多说,我们开始写代码:

老样子,我们创建三个文件,一个头文件:Stack.h,两个源文件:Stack.c和test.c。

我们先来看一下头文件代码:

我们大致要实现以上几个功能。

top是栈顶元素的位置或索引,可以通过top快速找到栈顶的元素。

capacity表示栈的容量。

栈的初始化:

我们初始化把top赋值为0,此时top就相当于顺序表中的size,表示有效数据的个数,top=0表示栈中没有元素。这里要注意一下。

栈的销毁:

代码比较简单,不在赘述。

入栈:

入栈检查是否需要扩容跟我们顺序表扩容一模一样,因为栈和顺序表都是通过数组来实现的,所以说代码会十分相似。这里的注意事项我们都在顺序表中讲过。

出栈:

只有短短几行代码,注意的是要断言一下保证top必须大于0,因为top等于0表示为空栈,此时不能再进行数据的删除。

获取栈顶数据:

我们上面讲过,初始化时top赋值为0这种方法top此时就相当于顺序表的size,指向栈顶位置的下一个元素,所以要找栈顶元素,下标为top-1,示意图如下:

判空:

这是一个比较巧妙的方法,pst->top==0为真,表示真,返回true;

pst->top不为0,表示假(即不是空栈),返回false。

获取元素的个数:

代码也是很简单,top和size类似,表示的就是有效数据的个数。

2.队列

2.1队列的概念及其结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的一种特殊的线性表。队列具有先进先出的特点。出队列:进行删除操作的一端称为对头,入队列:进行插入操作的一端称为队尾。

2.2队列的实现

我们通过上面的学习,知道了栈可以通过数据和链表来实现,通过数组实现栈效率更加高一些。

对于队列来说,也可以通过数组和链表来实现,但队列通过链表实现的效率更高一些,原因大致有:

1.插入和删除数据效率更高:链表队列插入删除时间复杂度为O(1),而数组队列插入删除数据时间复杂度为O(n)。

2.插入删除不用移动:由于链表队列不需要像数组队列那样在插入和删除操作时移动其他元素,因此在大部分情况下,链表队列的性能更稳定,不会因为元素数量的增加而导致操作时间的增加。

所以,我们接下来就用链表来实现队列。

我们还是创建3个文件,我们先来看头文件Queue.h的代码:

我们创建了两个结构体,QNode结构体表示链表队列的节点,而结构体Queue又有什么用呢?

假设我们没有结构体Queue,那么我们在实现入队出队函数时就要传二级指针了,(因为我们要修改一级指针phead的值,所以我们要进行传值调用,所以就要传一级指针的地址,拿二级指针接收)创建哨兵位不就可以传一级指针了吗?没错,但是插入数据尾指针该怎么办呢?我们需要维护尾指针的指向,还是比较麻烦。

所以我们就创建了Queue结构体,将相关的数据和操作组织在一起,提高代码的可读性和可维护性。构体 Queue 包含了队列的头指针 phead、尾指针 ptail 和大小 size,这些是队列操作所必需的基本元素

有点面向对象编程的意思了。

队列的初始化

代码如下:

参数为Queue结构体指针。没什么好讲的。

队列的销毁

这个和我们之前讲过的链表的销毁大同小异,需要注意的是最后千万不要free(pq),因为经过上面的while循环,phead和ptail指向的动态开辟的内存都已经释放掉了,再次释放会报错,这我们以前在动态内存管理中讲过。

入队

队列遵循先进先出,所以入队实际上就是头插数据,这个我们讲单链表讲过,不再赘述。

出队

出队列相当就是尾删。

获取队头数据

注意断言pq->phead,防止phead指向空,引发对空指针解引用的错误操作。

获取队尾数据

同时注意一下断言,比较简单。

获取队列元素个数

这就体现了我们在创建Queue结构体时,创建size成员变量的作用,大大的简化了我们的代码。

判空

思路和我们上面讲的栈的判空一模一样,不再赘述。

至此,我们学习并实现了栈和队列,那么肯定有小伙伴要问:学这个有什么用呢?下篇文章,我们就来讲解如何用栈和队列解决问题。希望大家能有所收获。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DML之操作数据表

1. 插入数据 (1). 前言 前文我们实现了如果创建表,接下来我们将学习如何向数据表中插入数据.插入有两种方式. (2). 方式1 : 情况1 : 使用该语法一次只能向表中插入一条记录.为表中的任意字段按默认的顺序插入数据.值列表中需要为表的每一个字段指定值.并且值…

Android Studio开发之路(九)创建android library以及生成aar文件

一、需求 我做了一个camerax相机opencv图像处理图片上传服务器功能的android应用,应客户需求要将其改成一个SDK,由客户加到他们自己的app里边。 于是,我需要制作一个library,打包成aar文件(jar:只有代码,没…

如何在CentOS7本地搭建ONLYOFFICE办公套件结合内网穿透实现公网访问

文章目录 1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 本篇文章讲解如何使用Docker在本地服务器上安装ONLYOFFICE,并结合cpolar内网穿透实现公网访问。 Community Edition允许您在本地服务器上安装ONLYOFFICE文档&…

C++青少年简明教程:C++数据类型

C青少年简明教程:C数据类型 数据类型定义了变量可以存储哪些类型的数据,以及对这些数据可以进行哪些操作。C提供了丰富的数据类型供开发者使用。 下面是 C 中常见的数据类型: ★整型(int):整数类型的数据…

5 款免费好用的精品软件推荐!

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 1.系统优化软件 - Wise Care 365 Wise Care 365 -全球最快的系统优化软件!精简系统、管理启动项、清理和优化注册表、清理个人隐私…

给第一次接触产品设计的写的

设计概念 设计原则 你可以参考以下的原则在每次评估一个网站时,建立excel,包含两个表格 表格1: 启发式评估 评估人员姓名 设备/浏览器/OS 网站URL 日期容易修复度 (ER) E0.修复需要最大的努力 E1.修复需要相当大的努力 E2.修复需要一些努…

攻防演练-防守单位常见防守策略

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 防守单位常见防守策略 01 防守单位常见防守策略 为普及网络安全知识,提高网络安全防范意识,和网络安全工作技能。我们将向大家介绍网络安全攻防演练中防守单位的一些关键策…

怎么通过微信小程序实现远程控制8路控制器/断路器

怎么通过微信小程序实现远程控制8路控制器/断路器呢? 本文描述了使用微信小程序调用HTTP接口,实现控制8路控制器/断路器,支持8路输出,均可独立控制,可接入各种电器。 可选用产品:可根据实际场景需求&#…

想搭建AI知识库的企业看这篇就够了

企业要想在激烈的竞争中脱颖而出,有一套高效、智能的知识管理系统是非常重要的。搭建AI知识库能够帮助企业整合、分类、检索和应用知识,因此成为众多企业的第一选择。对于想要搭建AI知识库的企业来说,应该注意哪些方面呢?本文将从…

大模型管理工具:SWIFT

目录 一、SWIFT 介绍 二、SWIFT 安装 2.0 配置环境(可选) 2.1 使用pip进行安装 2.2 源代码安装 2.3 启动 WEB-UI 三、部署模型 3.0 deploy命令参数 3.1 原始模型 3.2 微调后模型 一、SWIFT 介绍 SWIFT(Scalable lightWeight Infrastructure for Fine-Tuni…

Vue 局部布局 Layout 内部布局 [el-row]、[el-col]

之前的布局容器是一个整体的框架,layout里面的布局其实就是el-row和el-col的组合。 基础布局 使用单一分栏创建基础的栅格布局。 通过 ​row ​和 ​col ​组件,并通过 ​col ​组件的 ​span ​属性我们就可以自由地组合布局。 这种最简单,…

房屋出租管理系统需求分析及功能介绍

房屋租赁管理系统适用于写字楼、办公楼、厂区、园区、商城、公寓等商办商业不动产的租赁管理及租赁营销;提供资产管理,合同管理,租赁管理, 物业管理,门禁管理等一体化的运营管理平台,提高项目方管理运营效率…