【数据结构(六)】队列

❣博主主页: 33的博客❣
▶️文章专栏分类:数据结构◀️
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你学更多数据结构知识

在这里插入图片描述

目录

  • 1.前言
  • 2.概念
  • 3.队列的使用
  • 4.循环队列
  • 5.双端队列
  • 6.经典习题
    • 6.1队列实现栈
    • 6.2栈实现队列
  • 7.总结

1.前言

同学们排队等过车吧,最先去排队的人就是第一个出队上车的人。这就是日常生活中的队列。在数据结构中,队列也是这样的,最先进队的人最先出队,那我们就通过这篇文章来了解队列的详细知识点吧。

2.概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头(Head/Front)
在这里插入图片描述


3.队列的使用

在Java中,Queue是个接口,底层是通过链表实现的。
在这里插入图片描述
注意
Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。

public static void main(String[] args) {Queue<Integer> q = new LinkedList<>();q.offer(1);q.offer(2);q.offer(3);q.offer(4);q.offer(5);                  // 从队尾入队列System.out.println(q.size());System.out.println(q.peek());  // 获取队头元素q.poll();System.out.println(q.poll());  // 从队头出队列,并将删除的元素返回if(q.isEmpty()){System.out.println("队列空");}else{System.out.println(q.size());}}

4.循环队列

实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列通常使用数组实现
在这里插入图片描述
设计循环队列:
在这里插入图片描述
设计思路

1.首先要创建一个数组,我们再定义两个参数来确定环形数组的下个元素存放的下标end和第一个元素下标first。
2.当添加元素时,直接添加到end位置,end+1,但如果如上图,走到7的位置,那么end能直接+1吗?肯定是不行的,那么我们就可以把下一个下标定义为(end+1)%queue.length
3.那么我们该如何判满和判空呢?我们通常认为如果end下标等于first下标就认为空,如果end是下一个元素的下标等于first元素下标,那么就认为队列满,这样判断我们就会浪费一个空间来,所以设置数组大小的时候为K+1

public class MyCircularQueue {int[] queue;int first=0;int end=0;MyCircularQueue(int k){queue=new int[k+1];}public int Front(){if(isEmpty()){return -1;}return queue[first];}public int Rear(){if (isEmpty()) {return -1;}if (end==0){return queue[queue.length-1];}else {return queue[end-1];}}public Boolean enQueue( int value){if(isFull()){return false;}queue[end]=value;end=(end+1)%queue.length;return true;}public Boolean deQueue(){if(isEmpty()){return false;}first=(first+1)%queue.length;return true;}public Boolean isEmpty(){if(first==end){return true;}else {return false;}}public Boolean isFull(){if((end+1)%queue.length==first){return true;} else {return false;}}
}

5.双端队列

***双端队列(deque)***是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。
Deque是一个接口,使用时必须创建LinkedList或者ArrayList的对象。
在这里插入图片描述
在实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口。

Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现
Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现

6.经典习题

6.1队列实现栈

使用两个队列实现一个后入先出(LIFO)的栈:OJ链接
解题思路

插入元素的时候,哪一个队列不为空就插入哪一个队列
删除元素的时候,先把size-1个元素移到另外一个队列,再删除最会一个元素
易错点,不能定义stack.size()来表示从一个队列进入另一个队列的元素,因为size是一直在变的。

public class MyStack {public Queue<Integer> sq1;public Queue<Integer> sq2;public int size=0;public MyStack() {sq1=new LinkedList<>();sq2=new LinkedList<>();;}public void push(int x) {if(!sq1.isEmpty()){sq1.offer(x);}if(!sq2.isEmpty()){sq2.offer(x);}if(sq1.isEmpty()&&sq2.isEmpty()){sq1.offer(x);}size++;}public int pop() {if(!sq1.isEmpty()){for (int i=0;i<size-1;i++){int x= sq1.poll();sq2.offer(x);}size--;return sq1.poll();}else if(!sq2.isEmpty()){for (int i=0;i<size-1;i++){int x= sq2.poll();sq1.offer(x);}}size--;return sq2.poll();}public int top() {int x=-1;if(!sq1.isEmpty()){for (int i=0;i<size;i++){x= sq1.poll();sq2.offer(x);}}else if(!sq2.isEmpty()){for (int i=0;i<size;i++){x= sq2.poll();sq1.offer(x);}}return x;}public boolean empty() {return sq1.isEmpty()&&sq2.isEmpty();}}

6.2栈实现队列

请你仅使用两个栈实现先入先出队列:OJ链接
解题思路

定义两个栈s1,和s2,每次入队列存入s1中,每次出队列存入s2中。
当要出队列时,就把s1的元素依次出队,进入s2当中,s2再出队列
易错点,不能定义stack.size()来表示从s1进入s2的元素,因为s1的size是一直在变的。

class MyQueue {Stack<Integer> stack1;Stack<Integer> stack2;public MyQueue() {stack1=new Stack<>();stack2=new Stack<>();}public void push(int x) {stack1.push(x);}public int pop() {if(stack2.isEmpty()){while(!stack1.isEmpty()){stack2.push(stack1.pop());}} return stack2.pop();}public int peek() {if(stack2.isEmpty()){while(!stack1.isEmpty()){stack2.push(stack1.pop());}} return stack2.peek();}public boolean empty() {return stack2.isEmpty()&&stack1.isEmpty(); }
}

7.总结

本篇文章主要介绍了队列的使用,循环队列,双端队列,以及如何用队列实现栈,用栈实现队列。

下期预告:二叉树

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

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

相关文章

一款挺不错网站维护页面HTML源码

一款挺不错网站维护页面源码&#xff0c;单HTML不需要数据库&#xff0c;上传到你的虚拟机就可以用做维护页面还不错&#xff0c;用处多。。 源码下载 一款挺不错网站维护页面源码

LangChain LangServe 学习笔记

LangChain LangServe 学习笔记 0. 引言1. LangServe 概述2. 特性3. 限制4. 安装5. 示例应用程序6. OpenAPI文档7. Python SDK 客户端8. Playground9. 聊天可运行页面 0. 引言 使用 LangServe 可以立即将您的LLM应用程序变成 API 服务器。 LangServe 使用 FastAPI 构建&#x…

three.js(1):three.js简介

1 什么是three.js three.js&#xff0c;一个WebGL引擎&#xff0c;基于JavaScript&#xff0c;可直接运行GPU驱动游戏与图形驱动应用于浏览器。其库提供的特性与API以绘制3D场景于浏览器。 2 下载地址 three.js下载地址:https://github.com/mrdoob/three.js 3 目录介绍 下载…

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题5

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题5 第一阶段竞赛项目试题 本文件为信息安全管理与评估项目竞赛-第一阶段试题&#xff0c;第一阶段内容包括&#xff1a;网络平台搭建与设备安全防护。 本次比赛时间为180分钟。 介绍 竞赛阶段…

浅谈函数 fscanf/sscanf 和 fprintf/sprintf

目录 一&#xff0c;fprintf 的介绍和使用1. 函数介绍2. 函数使用 二&#xff0c;fscanf 的介绍和使用1. 函数介绍2. 函数使用 三&#xff0c;sprintf 的介绍和使用1. 函数介绍2. 函数使用 四&#xff0c;sscanf 的介绍和使用1&#xff0c;函数介绍2&#xff0c;函数使用 五&am…

SSL Pinning之双向认证

双向认证处理流程 概述获取证书逆向app 获取证书的KeyStore的 key通过jadx 反编译 app 获取证书&#xff1a;frida hook 证书转换命令行转换portecle 工具使用 charles 配置 p12 格式证书 概述 本篇只介绍怎么解决ssl pinning&#xff0c; 不讲ssl/tls 原理。 为了解决ssl pinn…

RT-Thread 多级目录 scons 构建

前言 RT-Thread 默认使用 scons 进行工程的构建&#xff0c;虽然 RT-Thread BSP 中的 hello world 例程比较简单&#xff0c;实际项目开发&#xff0c;可能源码的工程会由多级目录&#xff0c;如何让多级的目录参与构建&#xff1f; scons 构建时&#xff0c;除了依赖工程的根…

基于R语言实现的beta二项回归模型【理解与实现】

本实验&#xff0c;创建一组使用二项分布模拟的数据&#xff08;不带额外的随机性&#xff09;&#xff0c;和另一组使用Beta二项分布模拟的数据&#xff08;引入了随机成功概率 p&#xff0c;从而增加了数据的离散性。 现在假设我们站在上帝视角&#xff0c;有两组不知道分布…

Qt 中默认代码

目录 主函数 widget的声明 widget的定义 form file .pro 文件 主函数 #include "widget.h" ​ #include <QApplication> ​ int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 上面就是 Qt 刚创建的一…

机器学习-随机森林温度预测模型优化

文章目录 前言旧模型训练新模型训练参数查看组合参数训练学习模型评估 前言 在机器学习-随机森林算法预测温度一文中&#xff0c;通过增大模型训练数据集和训练特征的方式去优化模型的性能&#xff0c;本文将记录第三方种优化方式&#xff0c;通过调整随机森林创建模型参数的方…

【高阶数据结构】哈希表 {哈希函数和哈希冲突;哈希冲突的解决方案:闭散列,开散列;红黑树结构 VS 哈希结构}

一、哈希表的概念 顺序结构以及平衡树 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系。因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较。顺序查找时间复杂度为O(N)&#xff1b;平衡树中为树的高度&#xff0c;即O(log_2 N)&#xf…

区间比较指令

1&#xff0c;比较值和和区间值比较 2&#xff0c;指令 ZCP K2 K5 C0 Y000 3&#xff0c;当比较值小于 区间返回 软元件灯亮 当比较直在区间内软元件1 接通 > 第一个 < 第二个 大于第二个值 软元件2接通 如果区间中第二个值大于第一个值那个只比较第一个值 直接比较 参数…

【HTML】制作一个简单的实时字体时钟

目录 前言 HTML部分 CSS部分 JS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建一个文本文档&#xff0c;两个文件夹&#xff0c;其中HTML的文件名改为[index.html]&am…

202209青少年软件编程(scratch图形化) 等级考试试卷(四级)

第1题&#xff1a;【 单选题】 运行下列程序&#xff0c;说法正确的是&#xff1f;&#xff08;&#xff09; A:列表中的数字全部小于11 B:列表的长度为 10 C:变量i最终值为 20 D:列表中有大于 10 的数字 【正确答案】: D 【试题解析】 : 程序运行后&#xff0c;变量i最…

Spark 应用程序优化和调优总结

文章目录 前言调整 Spark 默认配置查看和设置 Spark 配置信息动态扩展集群负载 数据的缓存和持久化DataFrame.cache()DataFrame.persist()何时缓存和持久化何时不缓存和持久化 Spark 中的 JOINs广播连接排序合并连接 总结 前言 本文总结了 Spark 中比较重要和常用的调优手段&a…

【探讨】光场空间结构全维度非线性调控理论及应用

摘要&#xff1a;得益于数字全息与几何相位平面光学技术的逐渐成熟&#xff0c;空间结构光场调控及应用研究已在线性光学领域取得蓬勃发展。与之相比&#xff0c;以非线性光学为物理途径的相关研究虽能实现许多关键功能(如光场间信息交互)却仍处于起步阶段。笔者课题组在国家自…

MoonBit 最新动态:MoonBit 引入实验性的测试覆盖率统计工具

MoonBit更新 支持 array.iter intrinsic 并且已经对标准库中的函数进行标注&#xff0c;从而可以在特定情况下将循环进行内联&#xff0c;以提升运行效率 /// intrinsic %array.iter pub fn iter[T](self : Array[T], f : (T) -> Unit) -> Unit {for i 0; i < self…

C语言100道练习题打卡(1)

1 有1&#xff0c;2&#xff0c;3&#xff0c;4四个数字&#xff0c;能组成多少个互不相同且不重复的三位数&#xff0c;都是多少 #include<stdio.h> //有1&#xff0c;2&#xff0c;3&#xff0c;4四个数字&#xff0c;能组成多少个互不相同且不重复的三位数&#xff…

Spring Batch

Spring是一个开放源代码的J2EE应用程序框架&#xff0c;由Rod Johnson发起&#xff0c;是针对bean的生命周期进行管理的轻量级容器&#xff08;lightweight container&#xff09;。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题&#xff0c;提供了功能强大IOC、AOP及W…

物联网数据集CIC IoT Dataset 2023和(TON_IoT)数据集以及网络数据集UNSW-NB15 Dataset:可单卖(si聊有优惠)

数据集描述如下&#xff1a; CIC IoT Dataset 2023是由加拿大网络安全研究所提供的一个数据集&#xff0c;旨在促进物联网&#xff08;IoT&#xff09;环境中大规模攻击的安全分析应用程序的开发。该数据集包含33种攻击&#xff0c;分为7类&#xff0c;包括DDoS、DoS、侦察、基…