数据结构之栈和队列

数据结构之栈和队列

  • 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 struct
	int *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、队列的应用

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】【Python】【练习题】【新加坡南洋理工大学】【Computer Control Network】

一、题目描述 该题目描述一个网络中数据包交换(Packet Switching)的例子。题目如下: 二、问题解答(使用Python) Q1:如何求出0.0004这个值? (1)、公式推导过程&#xf…

4.servera修改主机名,配置网络,以及在cmd中远程登录servera的操作

1.先关闭这两节省资源 2.对于新主机修改主机名,配置网络 一、配置网络 1.推荐图形化界面nmtui 修改完成后测试 在redhat ping一下 在redhat远程登录severa 2、使用nmcli来修改网络配置 2.1、配置要求:主机名: node1.domain250.exam…

<信息安全>《1 国内主要企业网络安全公司概览(一)》

1 深信服科技股份有限公司 信息内容LOGO成立日期2000年12月25日成立。总部深圳市南山区学苑大道1001号南山智园A1栋是否上市深信服[300454]A股市值265亿主要产品企业级网络安全云计算IT基础设施数据通信物联网员工规模9000人分支机构全球50多个荣誉国家级高新技术企业、中国软…

JVM系列-3.类的生命周期

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理🔥如果感觉博主的文…

Kotlin协程的JVM实现源码分析(下)

协程 根据 是否保存切换 调用栈 ,分为: 有栈协程(stackful coroutine)无栈协程(stackless coroutine) 在代码上的区别是:是否可在普通函数里调用,并暂停其执行。 Kotlin协程&…

NG+WAF实现应用安全访问

一、基本概念 什么是waf? Web应用防火墙(waf)是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品,WAF是一种工作在应用层的、通过特定的安全策略来专门为Web应用提供安全防护的产品。 什么是ngx_lua_…

2024年开年的荣誉--来自国产数据库

上周在北京参加了阿里云的开发者大会,我因为去年做了一点小贡献。非常荣幸的获得了阿里云的MVP的这个殊荣。(期间也认识了一些大神级的人物)还有就是一些网上认识的打卡们线下见面。 这个也是我一直追求的荣誉。 几乎在同时P(Ping…

单机zk--数据恢复,处理客户端接入,两种超期机制,处理客户端请求,客户端主动断开

1.概述 zk是一个分布式内存数据库。既然是数据库,就需要处理客户端发送过来的读,写请求。随着请求执行,不断更改数据实体。 作为内存数据库,数据实体全部加载到内存,在内存修改。我们把客户端发来的请求叫做事务&…

SpringCloud之OpenFeign的学习、快速上手

1、什么是OpenFeign OpenFeign简化了Http的开发。在RestTemplate的基础上做了封装,在微服务中的服务调用发送网络请求起到了重要的作用,简化了开发,可以让我们跟写接口一样调其他服务。 并且OpenFeign内置了Ribbon实现负载均衡。 官方文档…

【RT-DETR有效改进】华为 | Ghostnetv1一种专为移动端设计的特征提取网络

前言 大家好,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持ResNet32、ResNet101和PP…

代码随想录二刷 | 回溯 | 组合优化

代码随想录二刷 &#xff5c; 回溯 &#xff5c; 组合优化 剪枝优化 剪枝优化 在遍历的过程中有如下代码&#xff1a; for (int i startIndex; i < n; i) {path.pop_back();backtracking(n, k, i 1);path.pop_back(); }n 4&#xff0c;k 4的话&#xff0c;那么第一层f…

SQL注入实战:盲注

盲注&#xff1a; 1、当攻击者利用SQL注入漏洞进行攻击时&#xff0c;有时候web应用程序会显示&#xff0c;后端数据库执行SQL查询返回的错误信息&#xff0c;这些信息能帮助进行SQL注入&#xff0c;但更多时候&#xff0c;数据库没有输出数据web页面&#xff0c;这是攻击者会…

flutter 实现定时滚动的公告栏的两种不错方式

相同的部分 自定义一个类继承StatefulWidget 所有公告信息存放在list里 第一种 scrollControllerAnimatedContainer 逻辑如下 我们可以发现启动了一个timer计时器计时5秒&#xff0c;hasClients检查其目标对象&#xff08;我们用的是listview&#xff09;是否被渲染&#x…

文件重命名技巧:如何使用编号快速高效地重命名大量文件的方法

在处理大量文件时&#xff0c;我们经常需要对其进行重命名&#xff0c;以便更好地组织和管理。然而&#xff0c;手动重命名每个文件既耗时又容易出错。为了解决这个问题&#xff0c;我们可以利用一些简单的编号技巧来快速高效地重命名大量文件。下面将介绍一种简单而实用的方法…

【好文翻译】JavaScript 中的 realm 是什么?

本文由体验技术团队黄琦同学翻译。 原文链接&#xff1a; https://weizmangal.com/2022/10/28/what-is-a-realm-in-js/ github仓库地址&#xff1a; https://github.com/weizman/weizman.github.io/blob/gh-pages/_posts/2020-02-02-what-is-a-realm-in-js.md 前言 作为我对…

前端安全相关

请求后端接口必须带上sign 以上主要是解决&#xff1a;除了数据泄露外&#xff0c;一些重要功能的接口如果没有做好保护措施也会被恶意调用造成DDoS、条件竞争等攻击效果 一些营销活动类的Web页面&#xff0c;领红包、领券、投票、抽奖等活动方式很常见。此类活动对于普通用户…

LOSS损失函数值是什么意思?

环境&#xff1a; Bert-VITS2-v2.3 问题描述&#xff1a; LOSS损失函数值是什么意思&#xff1f; 解决方案&#xff1a; 在机器学习和深度学习中&#xff0c;损失函数&#xff08;Loss Function&#xff09;用来衡量模型预测值与实际值之间的差异或误差。LOSS损失函数值是…

Kaggle之旅3

Kaggle之旅3 文章目录 Kaggle之旅3前言一、Predict survival on the Titanic and get familiar with ML basics二、开始1.基础知识构造随机森林的4个步骤 2.结合教程继续 总结 前言 今天继续Kaggle之旅&#xff0c;尝试Titanic - Machine Learning from Disaster 一、Predict…

java eazyexcel 实现excel的动态多级联动下拉列表(1)使用名称管理器+INDIRECT函数

原理 将数据源放到一个新建的隐藏的sheet中将选项的子选项的对应字典设置到名称管理器中&#xff08;名称是当前选项的内容&#xff0c;值是他对应的子菜单的单元格范围&#xff0c;在1里面的sheet中&#xff09;子菜单的数据根据INDIRECT函数去左边那个单元格获取内容&#x…