数据结构之栈和队列

数据结构之栈和队列

  • 1、栈
    • 1.1、栈的定义及基本运算
    • 1.2、栈的存储结构
  • 2、队列
    • 2.1、队列的定义及基本运算
    • 2.2、队列的存储结构
    • 2.3、队列的应用

  数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用计算机解决问题的效率服务。
  数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间的相互关系是数据的 逻辑结构,数据元素及元素之间关系的存储称为 存储结构(或物理结构)。数据结构按照逻辑关系的不同分为 线性结构非线性结构两大类,其中,非线性结构又可分为树结构和图结构。
  线性结构是一种基本的数据结构,主要用于对客观世界中具有单一前驱和后继的数据关系进行描述。线性结构的特点是数据元素之间呈现一种线性关系,即元素“一个接一个排列”。
  栈和队列是程序中常用的两种数据结构,它们的逻辑结构和线性表相同。其特点在于运算有所限制:栈按“后进先出”的规则进行操作,队列按“先进先出”的规则进行操作,故称为运算受限的线性表。

1、栈

1.1、栈的定义及基本运算

  (1)栈的定义
  栈是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。换句话说,栈的修改是按先进后出的原则进行的。因此,栈又称为后进先出 (Last In First Out,LIFO)的线性表。在栈中进行插入和删除操作的一端称为栈顶 (Top),相应地,另一端称为栈底(Bottom)。不含数据元素的栈称为空栈。
  (2) 栈的基本运算
  ① 初始化栈 InitStack(S):创建一个空栈 S。
  ② 判栈空isEmpty(S):当 S 为空时返回“真”,否则返回“假”。
  ③ 入栈 Push(S,x): 将元素x加入栈顶,并更新栈顶指针。
  ④ 出栈 Pop(S): 将栈顶元素从中删除,并更新栈顶指针。若需要得到栈顶元素的值,可将 Pop(S)定义为一个返回栈顶元素值的函数。
  ⑤ 读栈顶元素 Top(S): 返回栈顶元素的值,但不修改栈顶指针。
  在应用中常使用上述 5 种基本运算实现基于栈结构的问题求解

1.2、栈的存储结构

  (1)顺序存储。栈的顺序存储是指用一组地址连续的存储单元依次存储自栈顶到栈底的数据元素,同时附设指针 top 指示栈顶元素的位置。采用顺序存储结构的栈也称为顺序栈。在这种存储方式下,需要预先定义(或申请) 栈的存储空间,也就是说,栈空间的容量是有限的。因此,在顺序栈中,当一个元素入栈时,需要判断是否栈满(栈空间中没有空闲单元),若栈满,则元素不能入栈。
  (2)栈的链式存储。用链表作为存储结构的栈也称为链栈。由于栈中元素的插入和删除仅在栈顶一端进行,因此不必另外设置头指针,链表的头指针就是栈顶指针。链栈的表示如下图所示。在这里插入图片描述

  (3) 栈的应用。栈的典型应用包括表达式求值、括号匹配等,在计算机语言的实现以及将递归过程转变为非递归过程的处理中,栈有重要的作用。

2、队列

2.1、队列的定义及基本运算

  (1)队列的定义。队列是一种先进先出 (First In First Out,FIFO) 的线性表,它只允许在表的一端插入元素,而在表的另一端删除元素。在队列中,允许插入元素的一端称为队尾(Rear)。允许删除元素的一端称为队头 (Front)。
  (2)队列的基本运算。
  ① 初始化队列 InitQueue(Q): 创建一个空的队列Q。
  ② 判队空isEmpty(Q): 当队列为空时返回“真”,否则返回“假”。
  ③ 入队 EnQueue(Q,x): 将元素 x 加入到队列Q 的队尾,并更新队尾指针。
  ④ 出队 DelQueue(Q): 将队头元素从队列Q 中删除,并更新队头指针。
  ⑤ 读队头元素 FrontQue(Q): 返回队头元素的值,但不更新队头指针。

2.2、队列的存储结构

  (1)队列的顺序存储。队列的顺序存储结构又称为顺序队列,它也是利用一组地址连续的存储单元存放队列中的元素。由于队列中元素的插入和删除限定在表的两端进行,因此设置队头指针和队尾指针,分别指出当前的队头和队尾。
  下面设顺序队列Q的容量为 6,其队头指针为 front,队尾指针为 rear,头、尾指针和队列中元素之间的关系如下图 所示。
在这里插入图片描述

  在顺序队列中,为了降低运算的复杂度,元素入队时只修改队尾指针,元素出队时只修改队头指针。由于顺序队列的存储空间容量是提前设定的,所以队尾指针会有一个上限值,当队尾指针达到该上限时,就不能只通过修改队尾指针来实现新元素的入队操作了。若将顺序队假想成一个环状结构(通过整除取余运算实现),则可维持入队、出队操作运算的简单性,如下图所示,称之为循环队列。
在这里插入图片描述

  设循环队列Q的容量为 MAXSIZE,初始时队列为空,且 Q.rear 和 Q.front 都等于 0,如下图 (a) 所示。
  元素入队时,修改队尾指针 Q.rear =(Q.rear+I) % MAXSIZE,如下图 (b) 所示。
  元素出队时,修改队头指针 Q.front =(Q.front+1) % MAXSIZE,如下图(c)所示。
  根据队列操作的定义,当出队操作导致队列变为空时,则有 Q.rear = Q.front,如下图(d)所示;若入队操作导致队列满,则 Q.rear = Q.front,如下图 (e) 所示。
  在队列空和队列满的情况下,循环队列的队头、队尾指针指向的位置是相同的,此时仅仅根据 Q.rear和 Q.front之间的关系无法断定队列的状态。为了区别队空和队满的情况,可采用以下两种处理方式:其一是设置一个标志,以区别头、尾指针的值相同时队列是空还是满;其二是牺牲一个存储单元,约定以“队列的尾指针所指位置的下一个位置是队头指针时”表示队列满,如下图(f) 所示,而头、尾指针的值相同时表示队列为空。
在这里插入图片描述

  设队列中的元素类型为整型,则循环队列的类型定义如下:

#define MAXOSIZE 100
typedef structint *base;		/*循环队列的存储空间,假设队列中存放的是整型数*/int front;		/*指示队头,称为队头指针*/int rear;		/*指示队尾,称为队尾指针*/
)SqQueue;

  【函数】创建一个空的循环队列。

int InitQueue(SqOueue *Q)
/*创建容量为MAXOSIZE 的空队列,若成功返回0,否则返回-1*/
{Q -> base = (int*)malloc(MAXQSIZE*sizeof(int));if (!Q->base) return -1;Q->front = 0: 0->rear = 0, return 0;
}/*InitQueue*/

  【函数】元素入循环队列。

intEnQueue(SqQueue *Q, int e)	/*元素e入队,若成功返回0,否则返回-l*/
{if((O->rear+1) % MAXOSIZE == Q->front) return-1;Q->base[Q->rear] = e;Q->rear = (Q->rear+1) % MAXOSIZE;return 0;
}/*EnQueue*/

  【函数】元素出循环队列。

int DelOueue(SqOueue *Q, int *e)
/*若队列不空,则删除队头元素,由参数e带回其值并返回0,否则返回-1*/
{if( Q->rear == Q->front) return-1;*e = Q->base[Q->front];Q->front = (Q->front+1) % MAXQSIZE;return 0;
}/*DelQueue*/

  (2)队列的链式存储。队列的链式存储也称为链队列。这里为了便于操作,给链队列添加一个头结点,并令头指针指向头结点。因此,队列为空的判定条件是头指针和尾指针的值相同,且均指向头结点。队列的一种链式存储如下图所示。
在这里插入图片描述

2.3、队列的应用

  队列结构常用于处理需要排队的场合,例如操作系统中处理打印任务的打印队列、离散事件的计算机模拟等。

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

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

相关文章

FDM3D打印系列——宝可梦妙蛙种子

fdm打印妙蛙种子 大家好,我是阿赵。   每次打印3D模型,都有新的感觉,这次打印了个宝可梦里面的妙蛙种子,也就是俗称的蒜头王八。   先来看看成果,然后在后面再聊一下关于3D打印的一些体会。使用创想三维的Sermoon …

华为机考入门python3--(0)测试题1-句子平均重量

分类:字符串 知识点: 获取输入 input().strip().split(" ") 拼接列表 " ".join(list) 输出指定位数的浮点数 print("%.2f" % value) 题目来自【华为招聘模拟考试】 # If you need to import additional packages or c…

Dell戴尔XPS 8930笔记本电脑原装Win10系统 恢复出厂预装OEM系统

链接:https://pan.baidu.com/s/1eaTQeX-LnPJwWt3fBJD8lg?pwdajy2 提取码:ajy2 原厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、MyDell等预装程序 文件格式:esd/wim/swm 安装方式&am…

一文梳理金融风控建模全流程(Python)

▍目录 一、简介 风控信用评分卡简介 Scorecardpy库简介 二、目标定义与数据准备 目标定义 数据准备 三、安装scorecardpy包 四、数据检查 五、数据筛选 六、数据划分 七、变量分箱 卡方分箱 手动调整分箱 八、建立模型 相关性分析 多重共线性检验VIF KS和AUC …

李宏毅 Generative Adversarial Network(GAN)生成对抗网络

(延申)GAN Lecture 1 (2018)- Introduction_哔哩哔哩_bilibili Basic Idea of GAN 附课程提到的各式各样的GAN:https://github.com/hindupuravinash/the-gan-zoo 想要让机器做到的是生成东西。->训练出来一个generator。 假设要做图像生成,要做的是…

【Qt之模型视图】5. Qt库提供的视图便捷类

1. 前言 Qt提供了一些便捷的视图类,如QListWidget提供项目列表,QTreeWidget显示多级树结构,QTableWidget提供单元格项的表格。每个类都继承了QAbstractItemView类的行为,QAbstractItemView类实现了项目选择和标题管理的通用行为。…

16.5 参考文献——深度学习定位

16.5 一种高效鲁棒的多楼层室内环境指纹定位方法 同济大学 Zhao Y, Gong W, Li L, et al. An Efficient and Robust Fingerprint Based Localization Method for Multi Floor Indoor Environment[J]. IEEEa Internet of Things Journal, 2023. 2.相关工作 B.基于深度学习的…

固态硬盘优化设置

目录 前言: 关闭Windows Search 禁用系统保护(不建议) 不建议禁用系统保护原因 关闭碎片整理【机械硬盘】 提升固态硬盘速度 开启TRIM 合理使用固态硬盘的容量 正确关机 关闭开机自启 前言: 电脑配备固态硬盘就能一劳…

自我摸索:如何运营并玩转CSDN?

自注册CSDN以来已有七年之久,但真正运营CSDN也是最近一年的事情,大概就是22年底,参加2022 博客之星 的竞选。接触了很多大佬,也学习模仿着开始玩转CSDN,虽然没有同期运营的大佬们玩的6,但也有一些经验可以来…

this指针相关

一、类对象的存储方式 先说一下结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐 注意空类和没有成员变量的类的大小,编译器给了这两种类一个字节来唯一标识这个类的对象。 class A { public:int _a;int _b…

Python多线程—threading模块

参考:《Python核心编程》 threading 模块的Thread 类是主要的执行对象,而且,使用Thread类可以有很多方法来创建线程,这里介绍以下两种方法: 创建 Thread 实例,传给它一个函数。派生 Thread 的子类&#xf…

计算机体系结构——多处理机系统

一、概述 重要概念 评估指标 通信延迟 通信延迟=发送开销+跨越时间+传输延迟+接收开销 跨越时间 数字信号从发送方的线路端传送到接收方的线路端所经过的时间。 传输时间 全部的消息量除以线路带宽。 多处理机的架构 根…

Unity 之 Addressable可寻址系统 -- HybridCLR(华佗)+Addressable实现资源脚本全热更 -- 实战(二)

Unity 之 Addressable可寻址系统 -- HybridCLRAddressable实现资源脚本全热更 -- 实战 前言实现原理一,HybridCLR相关操作1.1 安装HybridCLR1.2 打包程序集1.2 设置面板1.3 补充元数据1.4 代码加载流程 二,Addressable资源管理2.1 生成热更代码资源2.2 创…

攻防世界——answer_to_everything-writeup

__int64 __fastcall not_the_flag(int a1) {if ( a1 42 )puts("Cipher from Bill \nSubmit without any tags\n#kdudpeh");elseputs("YOUSUCK");return 0LL; } kdudpeh这个东西,根据题目提示sha1加密 import hashlib flagkdudpeh x hashlib…

【Springboot】日志

1.日志的使用 日志主要用于记录程序运行的情况。我们从学习javase的时候就使用System.out.println();打印日志了,通过打印的日志来发现和定位问题,或根据日志来分析程序运行的过程。在Spring的学习中,也经常根据控制台的⽇志来分析和定位问题 。 日志除…

数据分析实战:城市房价分析

流程图: 1.读数据表 首先,读取数据集。 CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTATtarget0.00632182.3100.5386.57565.24.09129615.3396.94.98240.0273107.0700.4696.42178.94.9671224217.8396.99.1421.60.0272907.0700.4697.18561.14.9671224217…

大英第四册课后翻译答案

目录 Unit 1Unit 2Unit 3Unit 4小结: Unit 1 中庸思想(Doctrine of the Mean)是儒家思想的核心内容。孔子所谓的“中”不是指“折中”,而是指在认识和处理客观事物时的一种“适度”和“恰如其分”的方法。孔子主张不仅要把这种思…

街机模拟游戏逆向工程(HACKROM)教程:[14]68K汇编-标志寄存器

在M68K中,有许多条件分支指令,和jmp指令一样也会修改PC达到程序跳转或分支的目的,不过这些会根据一些情况或状态来选择是否跳转。而在M68K中,有一个特别的寄存器来标记这些情况。 CCR(状态标志寄存器) CCR寄存器是用来保存一些对…

微前端-无界wujie

无界微前端方案基于 webcomponent 容器 iframe 沙箱,能够完善的解决适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户的核心诉求。 主项目安装无界 vue2项目:npm i wujie-vue2 -S vue3项目…

77. 组合 - 力扣(LeetCode)

题目描述 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 输入示例 n 4, k 2输出示例 [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]解题思路 我们使用回溯、深度优先遍历的思想,我们使用一个栈 path…