当前位置: 首页 > news >正文

数据结构——栈和队列(队列的定义、顺序队列以及链式队列的基本操作)

目录

队列(queue)的定义

顺序队——队列的顺序表示和实现

顺序队列(循环队列)的类型定义

顺序队列上溢问题的解决方法

​编辑

循环队列的基本操作

队列的基本操作——队列的初始化

队列的基本操作——求队列的长度

队列的基本操作——循环队列入队

队列的基本操作——循环队列出队

队列的基本操作——取队头元素

队列的基本操作——取队尾元素

链队——队列的链式表示和实现

链队列的类型定义

链队列的基本操作

链队列的基本操作——链队列初始化

链队列的基本操作——链队列销毁

链队列的基本操作——将元素e入队

链队列的基本操作——将元素e出队


队列(queue)的定义

顺序队——队列的顺序表示和实现

  • 队列和栈一样,也是限定只能在表的“端点”进行的线性表
  • 队列在插入的时候,只能在表尾进行插入,在删除的时候,只能在表头进行删除。(先进先出),表尾即队尾,表头即队头
  • 栈和队列是线性表的子集(是插入和删除位置受限的线性表)
  • 由于队列的操作具有先进先出的特性,使得队列成为程序设计中解决类似排队问题的有用工具。
  • 队列的逻辑结构与同线性表相同,仍为一对一关系。
  • 队列的存储结构有顺序队和链队,以循环顺序队列更常见。
  • 关键是掌握入队出队操作,具体实现依顺序队或链队的不同而不同。

顺序队列(循环队列)的类型定义

  • 队列的顺序表示——用一维数组base[MAXQSIZE]
#define MAXQSIZE 100 //最大队列长度
typedef struct
{QElemType* base; //初始化的动态分配存储空间int front; //头指针(队头元素的下标)int rear;  //尾指针(队尾元素的下标)
}SqQueue;
顺序队列上溢问题的解决方法

初始:front = rear = 0

入队:base[rear] = x;  rear++;

出队:x = base[front]; front++;

空队标志:front == rear

上面的假设存在什么问题呢?有下面的两种情况:

解决上溢出的方法

1、将队中元素依次向队头方向移动。

缺点:浪费时间,每移动一次,队中元素都要移动。

2、将队空间设想成一个循环的表,即分配给队列的m个存储单元可以循环使用,当rear为maxqsize时,若向量的开始端空着,又可以从头使用空着的空间。当front为maxqsize时,也是一样。

解决假上溢的方法——引入循环队列

base[0]接在base[MAXQSIZE-1]之后,若rear+1==M,则令rear = 0;

实现方法:利用%运算

插入元素

Q.base[Q.rear] = x;  //base为动态分配的一维数组
Q.rear = (Q.rear + 1) % MAXQSIZE;

删除元素

x = Q.base[Q.front];
Q.front = (Q.front + 1) % MAXQSIZE;

将上述方法想象成循环队列,如下图:

如果这样操作的话就会出现新的问题,就是队空和队满的时候,front = rear 

那么如何解决这个问题呢,我们接下面往下分析:

解决方案:

1、另外设一个标志以区别队空、队满

2、另设一个变量,记录元素个数

3、少用一个元素空间循环队列解决队满时判断方法——少用一个元素空间

循环队列的基本操作

  • 队列的基本操作——队列的初始化
#define MAXQSIZE 100
typedef int QElemType;
Status InitQueue(SqQueue& Q) //C++中的引用操作,不是单纯的值拷贝,类似给变量取别名,还是同一块内存
{Q.base = new QElemType[MAXQSIZE]; //分配数组空间,利用C++关键字new实现//.base = malloc(MAXQSIZE*sizeof(QElemType)); //C语言实现if (!Q.base)exit(OVERFLOW);Q.front = Q.rear = 0;return OK;
}
  • 队列的基本操作——求队列的长度
int QueueLength(SqQueue Q)
{return ((Q.rear-Q.front+MQXQSIZE)%MAXQSIZE);
}
  • 队列的基本操作——循环队列入队
Status EnQueue(SqQueue& Q, QlemType e)
{if ((Q.rear + 1) % MAXQSIZE == Q.front)return ERROR;  //队满Q.base[Q.rear] = e;    //新元素加入队尾Q.rear = (Q.rear + 1) % MAXQSIZE;//队尾指针+1return OK;
}
  • 队列的基本操作——循环队列出队
Status EnQueue(SqQueue& Q, QlemType &e)
{if ((Q.rear = Q.front)return ERROR;  //队空e = Q.base[front];    //保存队头元素Q.front = (Q.front + 1) % MAXQSIZE;//队头指针+1return OK;
}
  • 队列的基本操作——取队头元素
SElemType GetHead(SqQueue Q)
{if(Q.front!=Q.rear) //队列不为空return Q.base[Q.front];//返回队头指针元素的值,队头指针不变
}
  • 队列的基本操作——取队尾元素

链队——队列的链式表示和实现

        若用户无法估计所用队列的长度,则宜采用链队列

链队列的类型定义

#define MAXQSIZE 100  //最大队列长度
typedef struct Qnode
{QElemType data;struct Qnode* next;
}QNode,*QueuePtr;  //一个是结点类型,一个是指向结点的指针typedef struct
{QueuePtr front;//队头指针QueuePtr rear; //队尾指针
}LinkQueue; //链式队列

链队列的基本操作

  • 链队列的基本操作——链队列初始化
Status InitQueue(LinkQueue& Q)
{Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));Q.front->next = NULL;return OK;
}
  • 链队列的基本操作——链队列销毁

Status DestroyQueue(LinkQueue& Q)
{while (Q.front) {p = Q.front->next;//指针p指向头结点的下一结点free(Q.front);    //释放头结点Q.front = p;      //把指针指向的结点变为新的头结点}
}
  • 链队列的基本操作——将元素e入队
Status EnQueue(LinkQueue& Q, QElemType e) {p = (QueuePtr)malloc(sizeof(QNode));if (!p) exit(OVERFLOW);p->data = e;p->next = NULL;Q.rear->next = p;Q.rear = p;return OK;
}
  • 链队列的基本操作——将元素e出队
思路:
p=Q.front->next;  //暂存头结点的下一个,也就是第一结点
e=p->data;        //将要删除的队头的数据存下来
Q.front->next=p->next; //将头结点指向第二结点
delete p;   //释放要删除的元素的内存空间代码实现:
Status DeQueue (LinkQueue &Q,QElemType &e)
{if(Q.front==Q.rear) return ERROR;p=Q.front->next;e=p->data;Q.front->next=p->next;if(Q.rear==p) Q.rear=Q.front;delete p;return OK;
}
  • 链队列的基本操作——求链队列的队头元素
Status GetHead (LinkQueue Q QElemType &e)
{if(Q.front==Q.rear) return ERROR;e=Q.front->next->data;return OK;
}

相关文章:

数据结构——栈和队列(队列的定义、顺序队列以及链式队列的基本操作)

目录 队列(queue)的定义 顺序队——队列的顺序表示和实现 顺序队列(循环队列)的类型定义 顺序队列上溢问题的解决方法 ​编辑 循环队列的基本操作 队列的基本操作——队列的初始化 队列的基本操作——求队列的长度 队列的…...

el-table 的单元格 + 图表 + 排序

<el-table border :data"tableDataThree" height"370px" style"width: 100%"><el-table-column :key"activeName 8" width"50" type"index" label"序号" align"center"></el…...

FPGA第 9 篇,Verilog 中的关键字和基数

前言 在 Verilog 中&#xff0c;关键字&#xff08;Keywords&#xff09;和基数&#xff08;Radix&#xff09;是语言的重要组成部分&#xff0c;它们有助于描述和定义硬件设计。上期分享了 Verilog 的基本使用&#xff0c;以及数据类型、逻辑值和算数运算符的简单应用&#x…...

什么是单元测试?怎么做?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是单元测试&#xff1f; 单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件中的最小可测试单元进行检查和验证。至于“单元”的大小…...

论文复现--基于LeNet网络结构的数字识别

前言 一直就听说学习深度学习无非就是看论文&#xff0c;然后复现&#xff0c;不断循环&#xff0c;这段时间也看了好几篇论文(虽然都是简单的)&#xff0c;但是对于我一个人自学&#xff0c;复现成功&#xff0c;我感觉还是挺开心的 本人初学看论文的思路&#xff1a;聚焦网络…...

Vue3 响应式工具函数isRef()、unref()、isReactive()、isReadonly()、isProxy()

isRef() isRef()&#xff1a;检查某个值是否为 ref。 isRef函数接收一个参数&#xff0c;即要判断的值。如果该参数是由ref创建的响应式对象&#xff0c;则返回true&#xff1b;否则&#xff0c;返回false。 import { ref, isRef } from vue const normalValue 这是一个普通…...

数据结构之简单选择排序介绍与举例

简单选择排序 简单选择排序是一种排序算法&#xff0c;其基本思想是&#xff1a;通过n-i次关键字间的比较&#xff0c;从n-i1个记录中选出关键字最小的记录&#xff0c;并和第i个记录交换之。 举例&#xff1a; 给定数组 [64, 25, 12, 22, 11]&#xff0c;进行简单选择排序。…...

九、Redis 的实际使用与Redis的设计

一、多级缓存架构 在线上系统中&#xff0c;一定不会单纯的只部署一个Redis集群&#xff0c;而是使用Redis结合其他的多级缓存应用进行架构。 使用多级缓存架构的优点就是可以使不同类型的数据分布在不同的应用中&#xff0c;比如redis的热点key可以存储到nginx本地缓存、服务…...

乔拓云模板助力,微信小程序快速上线无需愁备案

想要快速打造并上线自己的微信小程序吗&#xff1f;乔拓云平台是您的不二之选&#xff01;无需担心复杂的备案流程&#xff0c;乔拓云提供免费服务&#xff0c;远程协助您轻松完成微信小程序的备案工作。 只需简单几步&#xff0c;您的小程序就能闪亮登场&#xff1a;首先&…...

Android命令行查看CPU频率和温度

在 Android 设备上&#xff0c;你可以通过命令行工具 adb 来查看 CPU 温度和 CPU 频率&#xff0c;并确定是否有降频情况。以下是具体步骤&#xff1a; 1. 查看 CPU 频率 你可以使用以下命令来查看 CPU 各个核心的当前频率&#xff1a; adb shell cat /sys/devices/system/c…...

力扣: 翻转字符串里的单词

文章目录 需求分析代码结尾 需求 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符…...

Wophp靶场寻找漏洞练习

1.命令执行漏洞 打开网站划到最下&#xff0c;此处的输入框存在任意命令执行漏洞 输入命令whoami 2.SQL注入 搜索框存在SQL注入&#xff0c;类型为整数型 最终结果可以找到管理员账户和密码 3.任意文件上传漏洞 在进入管理员后台后&#xff0c;上传木马文件 访问该文件&…...

国内智能运维厂商月度动态 202408

作为市场人员&#xff0c;虽然也添加了各类行业媒体、同行厂商的关注&#xff0c;但被同事问起业内动向时&#xff0c;常常也是记忆模糊、拍破脑袋也说不完整一件事。 所以找机会翻看了一下各大厂商的公号&#xff0c;先做个简单的8月汇总。 格式暂时是这样的&#xff1a; 整…...

C++ 左值与右值浅谈

左值与右值 序言概念左值和右值的划分理解右值引用常量左值引用与右值引用 移动语义引用折叠完美转发 参考资料 序言 虽然平常都算是了解左值&#xff0c;右值的用法&#xff0c;但是好记性不如烂笔头&#xff0c;记下来供大家评鉴&#xff0c;有错改错&#xff0c;有善赞善&a…...

oracle 如何查死锁

在Oracle中查看死锁通常涉及查询数据字典视图和动态性能视图。以下是一个基本的查询示例&#xff0c;用于检测和显示最近的死锁&#xff1a; SELECT dd.inst_id, dd.name, o.object_id, o.object_type, s.sid, s.serial#, s.username, p.spid, s.program,d.xidusn,d.xidslot,d…...

如何编写ChatGPT提示词

为ChatGPT编写有效的提示需要实施几个关键策略&#xff0c;以使文本到文本生成 AI 工具产生所需的输出。您可以使用 ChatGPT 提示&#xff08;也称为 ChatGPT 命令&#xff09;来增强您的工作或提高您在各个行业的表现。例如&#xff0c;营销人员可以提示 ChatGPT 为社交媒体帖…...

java项目之基于Spring Boot智能无人仓库管理源码(springboot+vue)

项目简介 智能无人仓库管理实现了以下功能&#xff1a; 基于Spring Boot智能无人仓库管理的主要使用者分为&#xff1a; 管理员的功能有&#xff1a;员工信息的查询管理&#xff0c;可以删除员工信息、修改员工信息、新增员工信息 &#x1f495;&#x1f495;作者&#xff1a…...

大厂前端常见的笔试题目

https://zhuanlan.zhihu.com/p/488383397前端面试手写题目总结-CSDN博客 大厂前端面试中常见的手写代码题目涵盖了多个方面&#xff0c;包括但不限于算法、数据结构、JavaScript 基础知识、DOM 操作、异步编程等。以下是一些常见的手写代码题目及其简要说明&#xff1a; 1. 排…...

网络插件 Cilium 更换 Calico

网络插件 Cilium 更换 Calico 集群使用 submariner &#xff0c;通过网络检测发现 Cilium 插件可能兼容性不太好 subctl diagnose allCilium 彻底卸载 helm uninstall cilium -n kube-system# 检查集群中的所有 CNI 插件&#xff08;集群的每个节点都需要删除&#xff09; s…...

SpringSecurity原理解析(二):认证流程

1、SpringSecurity认证流程包含哪几个子流程&#xff1f; 1&#xff09;账号验证 2&#xff09;密码验证 3&#xff09;记住我—>Cookie记录 4&#xff09;登录成功—>页面跳转 2、UsernamePasswordAuthenticationFilter 在SpringSecurity中处理认证逻辑是在UsernamePas…...

数据中台 | 数据资源管理平台介绍

01 产品概述 数据资源的盘查、集成、存储、组织、共享等全方位管理能力&#xff0c;无论对于企业的数字化转型&#xff0c;还是对企业数据资产的开发、运营、交易及入表&#xff0c;都具有极为关键的作用。今天&#xff0c;小兵就来为大家介绍我们自研数据智能平台中的核心产品…...

智慧环保平台建设方案

智慧环保平台建设方案摘要 政策导向与建设背景 背景&#xff1a;全国生态环境保护大会提出坚决打好污染防治攻坚战&#xff0c;推动生态文明建设&#xff0c;目标是在2035年实现生态环境质量根本好转。构建生态文明体系&#xff0c;包括生态文化、生态经济、目标责任、生态文明…...

SpringMVC映射请求;SpringMVC返回值类型;SpringMVC参数绑定;

一&#xff0c;SpringMVC映射请求 SpringMVC 使用 RequestMapping 注解为控制器指定可以处理哪些URL请求 1.1RequestMapping修饰类 注解RequestMapping修饰类&#xff0c;提供初步的请求映射信息&#xff0c;相对于WEB应用的跟目录。 注&#xff1a; 如果在类名前&#xff0…...

【第28章】Spring Cloud之Sentinel注解支持

文章目录 前言一、注解埋点支持二、SentinelResource 注解三、实战1. 准备2. 纯资源定义3. 添加资源配置 四、熔断(fallback)1. 业务代码1.1 Controller1.2 Service1.3 ServiceImpl 2. 熔断配置3. 熔断测试 总结 前言 上一章我们已经完成了对Sentinel的适配工作&#xff0c;这…...

鼎捷新一代PLM 荣膺维科杯 “2023年度行业优秀产品奖”

近日&#xff0c;由中国高科技行业门户OFweek维科网主办的“全数会2024&#xff08;第五届&#xff09;中国智能制造数字化转型大会暨维科杯工业自动化及数字化行业年度评选颁奖典礼”在深圳隆重举办。这不仅是中国工业自动化及数字化行业的一大品牌盛会&#xff0c;亦是高科技…...

如何升级用 Helm 安装的极狐GitLab Runner?

本分分享如何对 Helm 安装的 Runner 进行升级。整个过程分为三步&#xff1a;1、确定 Runner 最新版本或者想要升级的版本是否存在&#xff1b;2、用 Helm upgrade 命令进行升级&#xff1b;3、升级确认。 极狐GitLab 为 GitLab 的中国发行版&#xff0c;中文版本对中国用户更…...

08 vue3之认识bem架构及less sass 和scoped

bem架构 他是一种css架构 oocss 实现的一种 &#xff08;面向对象css&#xff09; &#xff0c;BEM实际上是block、element、modifier的缩写&#xff0c;分别为块层、元素层、修饰符层&#xff0c;element UI 也使用的是这种架构 1. BEM架构 1. 介绍 1. BEM是Block Element M…...

静态库的制作

静态库是一组对象文件的集合&#xff0c;它们在编译时被链接到可执行文件中。这意味着&#xff0c;静态库中的代码会被复制到每个使用它的程序中&#xff0c;因此静态库不需要在程序运行时被单独加载。制作静态库可以帮助你将常用的代码模块化、重用&#xff0c;简化开发过程。…...

PHP在现代Web开发中的高效应用与最佳实践

PHP在现代Web开发中的高效应用与最佳实践 在快速迭代的Web开发领域&#xff0c;PHP作为一门历史悠久且广泛应用的服务器端脚本语言&#xff0c;始终保持着其独特的魅力和强大的生命力。从简单的动态网页到复杂的企业级应用&#xff0c;PHP凭借其易学性、丰富的库支持和广泛的社…...

大数据-134 - ClickHouse 集群三节点 安装配置启动

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...