【数据结构】 队列(Queue)与队列的模拟实现

文章目录

  • 🍀队列(Queue)的概念
  • 🎋队列的使用
  • 🎍队列的模拟实现
    • 🚩创建队列
    • 🚩入队列
    • 🚩出队列
    • 🚩获取队头元素
    • 🚩获取队列长度
    • 🚩判断是否为空
    • 🚩完整代码
  • 🌳双端队列 (Deque)
  • ⭕总结

在这里插入图片描述

🍀队列(Queue)的概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有==先进先出FIFO(FirstIn First Out) ==入队列:

进行插入操作的一端称为队尾(Tail/Rear) 出队列:

进行删除操作的一端称为队头(Head/Front)
在这里插入图片描述

🎋队列的使用

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

使用如下:

import java.util.LinkedList;
import java.util.Queue;public class TestMain {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());}}
}

运行结果如下:
在这里插入图片描述

🎍队列的模拟实现

队列中既然可以存储元素,那底层肯定要有能够保存元素的空间,通过前面线性表的学习了解到常见的空间类型有两种:顺序结构 和 链式结构。

这里博主为大家演示一个双链表模拟实现队列

🚩创建队列

其实就是创建一个双链表,这里就不做过多赘述了,实现如下:

    public static class ListNode {ListNode next;ListNode prev;int value;ListNode(int value) {this.value = value;}}ListNode first; // 队头ListNode last; // 队尾int size = 0;

🚩入队列

向双向链表位置插入新节点,做法如下:

  • 创建一个节点newNode接收传进来的元素
  • 判断该队列是否为null
  • 若为null,则该元素就是队头
  • 若不为null,则将该元素的前驱节点设置为last;
  • last的后继节点变为newNode
  • newNode变为新的尾节点
  • size++

实现如下:

    // 入队列public void offer(int e) {ListNode newNode = new ListNode(e);if (first == null) {first = newNode;
// last = newNode;} else {last.next = newNode;newNode.prev = last;
// last = newNode;}last = newNode;size++;}

🚩出队列

将双向链表第一个节点删除掉,做法如下:

  • 分为几种情况
  • 当队列为空时
  • 则直接返回队列为空的异常,自定义异常如下
public class EmptyException extends RuntimeException{public EmptyException() {}public EmptyException(String message) {super(message);}
}
  • 当队列中只有一个元素----链表中只有一个节点时—直接删除
  • 当队列中有多个元素—链表中有多个节点----将第一个节点删除

实现如下:

    // 出队列---将双向链表第一个节点删除掉public int poll() {
// 1. 队列为空
// 2. 队列中只有一个元素----链表中只有一个节点---直接删除
// 3. 队列中有多个元素---链表中有多个节点----将第一个节点删除int value = 0;if (first == null) {throw new EmptyException("队列为空");} else if (first == last) {last = null;first = null;} else {value = first.value;first = first.next;first.prev.next = null;first.prev = null;}--size;return value;}

🚩获取队头元素

获取链表中第一个节点的值域

  • 若队列为null,抛出异常
  • 若不为null,返回队头的元素

实现如下:

    // 获取队头元素---获取链表中第一个节点的值域public int peek() {if (first == null) {throw new EmptyException("队列为空");}return first.value;}

🚩获取队列长度

直接返回size就好

实现如下:

   public int size() {return size;}

🚩判断是否为空

直接判断对头是否为null,然后返回就好

实现如下:

    public boolean isEmpty(){return first == null;}

🚩完整代码

MyQueue实现如下:

public class MyQueue {// 双向链表节点public static class ListNode {ListNode next;ListNode prev;int value;ListNode(int value) {this.value = value;}}ListNode first; // 队头ListNode last; // 队尾int size = 0;// 入队列---向双向链表位置插入新节点public void offer(int e) {ListNode newNode = new ListNode(e);if (first == null) {first = newNode;
// last = newNode;} else {last.next = newNode;newNode.prev = last;
// last = newNode;}last = newNode;size++;}// 出队列---将双向链表第一个节点删除掉public int poll() {
// 1. 队列为空
// 2. 队列中只有一个元素----链表中只有一个节点---直接删除
// 3. 队列中有多个元素---链表中有多个节点----将第一个节点删除int value = 0;if (first == null) {throw new EmptyException("队列为空");} else if (first == last) {last = null;first = null;} else {value = first.value;first = first.next;first.prev.next = null;first.prev = null;}--size;return value;}// 获取队头元素---获取链表中第一个节点的值域public int peek() {if (first == null) {throw new EmptyException("队列为空");}return first.value;}public int size() {return size;}public boolean isEmpty(){return first == null;}
}

🌳双端队列 (Deque)

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列

deque 是 “double ended queue” 的简称。

那就说明元素可以从队头出队和入队,也可以从队尾出队和入队
在这里插入图片描述
Deque是一个接口,使用时必须创建LinkedList的对象。
在这里插入图片描述
在实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口

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

⭕总结

关于《 【数据结构】 栈(Stack)与栈的模拟实现》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

自带云盘的内网即时通讯软件,保障数据在公司局域网内安全流通

在信息时代&#xff0c;很多对于内部机密性要求较高的企业&#xff0c;都不惜成本地选择在内网搭建专属的私有化即时通讯系统。企业员工在内部通讯与协同办公的时候&#xff0c;会分享一些文件、文档等资料&#xff0c; 为了保证所有在通讯软件流通的文件&#xff0c;就需要选…

CSS基础选择器及常见属性

文章目录 一、CSS1、CSS简介2、CSS语法规范 二、CSS基础选择器1、选择器的作用2、选择器分类3、基础选择器标签选择器类选择器id选择器通配符选择器 三、CSS常见属性1、字体属性字体系列字体大小字体粗细文字样式 2、文本属性文本颜色对齐文本装饰文本文本缩进行间距 四、CSS引…

17.3 【Linux】systemctl 针对 service 类型的配置文件

17.3.1 systemctl 配置文件相关目录简介 服务的管理是通过 systemd&#xff0c;而 systemd 的配置文件大部分放置于/usr/lib/systemd/system/ 目录内。但是 Red Hat 官方文件指出&#xff0c; 该目录的文件主要是原本软件所提供的设置&#xff0c;建议不要修改&#xff01;而要…

5. 线性层及其他层

5.1 神经网络结构 5.2 线性拉平 import torch import torchvision from torch import nn from torch.nn import ReLU from torch.nn import Sigmoid from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterdataset torchvision.datase…

常见API架构介绍

常见API架构介绍 两个服务间进行接口调用&#xff0c;通过调用API的形式进行交互&#xff0c;这是常见CS架构实现的模式&#xff0c;客户端通过调用API即可使用服务端提供的服务。相较于SPI这种模式&#xff0c;就是服务端只规定服务接口&#xff0c;但具体实现交由第三方或者自…

【Java 中级】一文精通 Spring MVC - 标签库 (八)

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

如何输出高质量软文,媒介盒子教你4大技巧

作为一名软文作者&#xff0c;只有知道软文写作的要求&#xff0c;才能打造一篇成功的软文&#xff0c;以便为企业或产品带来较高的关注度和曝光率&#xff0c;提高企业的知名度和品牌形象。下面就随小编一起来看看吧&#xff01; 1、吸引眼球的标题 标题是软文写作的灵魂&am…

【Linux】邮件服务器搭建 postfix+dovecot+mysql (终极版 超详细 亲测多遍无问题)

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录 前言基础原理准备工作一 、安装关于权…

【八股】2023秋招八股复习笔记5(计算机网络-CN)

文章目录 八股目录目录1、应用层 & HTTP一些http题HTTPS 加密原理&#xff08;问过&#xff09;HTTP/1.1 新特性HTTP/2.0 与 RPC&#xff08;问过&#xff09;GET 和 POST 比较 2、传输层 & TCPTCP三次握手 & 四次挥手&#xff08;问过&#xff09;为什么每次TCP 连…

在线查询让家长迅速获得录取通知书

发布录取通知书是一项看似简单却非常耗时费力的工作。负责录取工作的老师通常会采取以下常见的发放方式&#xff1a; 1. 面试告知&#xff1a;某些学校会在面试结束后立即告知学生是否被录取。这种方式通常适用于面试人数较少的学校或特定专业。 2. 电子邮件&#xff1a;学校通…

【Java转Go】快速上手学习笔记(五)之Gorm篇

目录 go get命令1、go get命令无响应问题2、Unresolved dependency错误 连接数据库连接.gomain.go 操作数据库创建表新增数据更新数据删除数据查询数据单表查询多表查询 用到的数据库表原生SQL 完整代码 go往期文章笔记&#xff1a; 【Java转Go】快速上手学习笔记&#xff08;…

【应用层】网络基础 -- HTTPS协议

HTTPS 协议原理加密为什么要加密常见的加密方式对称加密非对称加密 数据摘要&&数据指纹 HTTPS 的工作过程探究方案1-只使用对称加密方案2-只使用非对称加密方案3-双方都使用非对称加密方案4-非对称加密对称加密中间人攻击-针对上面的场景 CA认证理解数据签名方案5-非对…