数据结构 模拟实现Queue队列(双链表模拟)

目录

一、队列的概念

二、队列的接口

三、队列的方法实现

(1)offer方法

(2)poll方法

(3)peek方法

(4)size方法

(5)isEmpty方法

四、最终代码


一、队列的概念

类似我们现实生活中的在食堂排队打饭,排队靠前的先打饭,他为什么排队靠前呢,就是因为他先进行排队,名次靠前,才轮到他打饭,如图:

而队列是先进先出的数据结构,先放进去队列里的元素先出来,和栈的先进后出不同,类似上面的食堂排队打饭的例子。

我们自定义一个MyQueue类,里面有双向链表ListNode类,链表里面有存放数据的val变量,next域和prev域,记录头结点的head和尾节点的last,还有记录链表元素个数的usedSize,代码如下:

public class MyQueue implements IQueue{class ListNode {public int value;public ListNode prev;public ListNode next;public ListNode(int value) {this.value = value;}}ListNode head;ListNode last;int usedSize;
}


二、队列的接口

代码如下:

public interface IQueue {public boolean offer(int x);public int poll();public int peek();public int size();public boolean isEmpty();
}

三、队列的方法实现

(1)offer方法

此方法是入队列方法,首先要创建一个链表node,判断链表中为不为空,如果是空,就把head和last定义成node,usedSize++;如果不为空,就要尾差,把last.next变成node,node.prev变成last,最后再把last = node,usedSize++,代码如下:

    public boolean offer(int x) {ListNode node = new ListNode(x);if(head == null) {head = node;last = node;} else {last.next = node;node.prev = last;last = last.next;}usedSize++;return true;}

执行效果如下:

队列个数usedSize = 2,链表有两个节点。

(2)poll方法

此方法是出队列方法,首先判断链表是不是空,如果是空就出不了队列,抛异常;如果不为空,就判断head.next为不为空,也就是判断队列是不是只有一个元素,如果只有一个元素,就取出头结点的val值,再把head和last置为空,usedSize--;如果有多个元素,就取出头结点的val值,把头结点的next置为空,头结点往后走一步,头结点的prev置空,usedSize--。代码如下:

    public int poll() {if(head == null) {//队列为空,出不了队列,抛异常throw new EmptyException("队列为空");}if(head.next == null) {int retValue = head.value;last = null;head = null;usedSize--;return retValue;}int retValue = head.value;ListNode nodeNext = this.head.next;head.next = null;nodeNext.prev = null;head = nodeNext;usedSize--;return retValue;}//自定义异常类
public class EmptyException extends RuntimeException{public EmptyException(String msg) {super(msg);}
}

执行效果如下:

出队列三次,把队列出完,如果里面没元素了,就会抛异常。

(3)peek方法

此方法是取出队列的首元素,但不删除。首先要判断队列是不是空的,是空的就抛异常,不为空就返回队首元素val值,代码如下:

    public int peek() {if(head == null) {//队列为空,出不了队列,抛异常throw new EmptyException("队列为空");} else {int retValue = head.value;return retValue;}}//自定义异常类
public class EmptyException extends RuntimeException{public EmptyException(String msg) {super(msg);}
}

执行效果如下:

只拿队列首元素,不出队列。

(4)size方法

直接返回usedSize,代码如下:

    public int size() {return usedSize;}

执行效果如下:

返回队列元素的个数。

(5)isEmpty方法

直接返回head == null,代码如下:

    public boolean isEmpty() {return this.head == null;}

执行效果如下:

判断队列是否为空。


四、最终代码

//自定义接口
public interface IQueue {public boolean offer(int x);public int poll();public int peek();public int size();public boolean isEmpty();
}//MyQueue类
public class MyQueue implements IQueue{class ListNode {public int value;public ListNode prev;public ListNode next;public ListNode(int value) {this.value = value;}}ListNode head;ListNode last;int usedSize;@Overridepublic boolean offer(int x) {ListNode node = new ListNode(x);if(head == null) {head = node;last = node;} else {last.next = node;node.prev = last;last = last.next;}usedSize++;return true;}@Overridepublic int poll() {if(head == null) {//队列为空,出不了队列,抛异常throw new EmptyException("队列为空");}if(head.next == null) {int retValue = head.value;last = null;head = null;usedSize--;return retValue;}int retValue = head.value;ListNode nodeNext = this.head.next;head.next = null;nodeNext.prev = null;head = nodeNext;usedSize--;return retValue;}@Overridepublic int peek() {if(head == null) {//队列为空,出不了队列,抛异常throw new EmptyException("队列为空");} else {int retValue = head.value;return retValue;}}@Overridepublic int size() {return usedSize;}@Overridepublic boolean isEmpty() {return this.head == null;}
}//自定义异常类
public class EmptyException extends RuntimeException{public EmptyException(String msg) {super(msg);}
}

都看到这了,点个赞再走吧,谢谢谢谢谢!

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

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

相关文章

域名转移:将腾讯云转移至阿里云

当时注册域名时,腾讯域云相对便宜,但目前阿里云在业界更加成熟,因此将自己申请的域名由阿里云转移至阿里云,并记录转移过程。 一、域名转出 进入腾讯云,登陆后选择控制台,选择我的资源–域名注册–全部域名…

Android WiFi基础概览

Android WiFi 基础概览 1、WiFi协议2、Android WLAN 架构2.1 应用框架2.2 Wi-Fi 服务2.3 Wi-Fi HAL 3、相关编译 android13-release 1、WiFi协议 Wi-Fi(无线通信技术)_百度百科 2.4GHz 频段支持以下标准(802.11b/g/n/ax)&#xff…

科锐16位汇编学习笔记 04 乘除和移位指令

乘法和除法指令用的不多,因为效率很低 比较指令CMP (compare) •格式:CMP OPD,OPS •功能:(OPD) — (OPS),跟减法指令很像,但是不存结果 •说明:目的操作数减去源操作数,然后根据结果设置标志位,但该结…

作业三详解

作业3: 在作业1的基础上,整合修改、删除功能,可实现如下功能 1.进入新增页面,页面填入新增数据,提交表单,然后跳转到查询列表页面,列表页面显示所有记录(多一条新增的数据) 2.进入修改增页面,页面填入修改数据,提交表单,然后跳转到查询列表页面,列表页面显示所有…

Zoho SalesIQ:构建客户服务知识库的实用工具与指南

客服人员每天都有很多事情要做,包括在线聊天、音频通话、屏幕共享和发送电子邮件。为什么要将搜索常用信息添加到他们列表中呢?因为客户在遇到问题的同时想快速解决问题。所以,我们要使用Zoho SalesIQ客服系统构建客户服务知识库。 一、什么…

鸿蒙开发之拖拽事件

一、拖拽涉及的方法 Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)//拖拽开始.onDragStart((event: DragEvent) > {console.log(drag event onDragStartevent.getX())})//拖拽进入组件范围,需要监听onDrop配合.onDragEnter((event: DragEvent) …

【MongoDB】MongoDB查询语句find的使用,和提高查询速度的游标的使用,非常详细!!!

😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:MongoDB数据库 👐学习格言:成功不是终点,失败也并非末日,最重要的是继续前…

联合体类型和枚举类型

联合体 联合体类型的声明 像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。 联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共⽤体。 所以给联合体其中⼀个成员赋值,其他成员的值也跟着…

Postman 并发测试入门指南:如何模拟用户并发请求?

背景介绍 最近,我们发起了一个在线图书管理系统的项目。我负责的一个关键模块包括三个主要后台接口: 实现对books数据的检索。实施对likes数据的获取。通过collections端点访问数据。 应对高流量的挑战 在设计并部署接口时,我们不可避免地…

Vue3集成scss实现清除浏览器默认样式

1.首先去npm官网找到对应的reset.scss文件,复制内容在本地src下style建一个一模一样的文件,内容复制进去npm | Home 2.在style文件夹下再建一个index.scss文件,在它里边引入刚刚建好的reset.scss文件,如下 import ./reset.scss; …

我用 midjourney 创作的那些好看的图片

下面这些是个人的midjourney v5的关键词,各种类型都有 抽象画 One piece of original artwork from 1998 , in the style of confucian ideology, pop art-inspired collages, recycled material murals, meticulous military scenes, close-up intensity, grocer…

基于OpenCV的透视变换

基础概念 透视变换(Perspective Transformation)是仿射变换的一种非线性扩展,是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。 原理:将二维的图片投影到一个三维视平面上,然后再转换到二维坐标下&#…

八大算法排序@快速排序、递归版本一(C语言版本)

目录 快速排序版本一概念算法思想一二三 快排步骤代码实现时间复杂度空间复杂度特性总结 快速排序版本一 概念 快速排序(Quicksort)是一种高效的排序算法,它是由英国计算机科学家 Tony Hoare 在1960年提出的。快速排序是基于分治&#xff08…

C++中string的库函数

山再高,往上攀,总能登顶! 路再长,走下去,定能到达! 🎥烟雨长虹,孤鹜齐飞的个人主页 🔥个人专栏c 期待小伙伴们的支持与关注!!! 目录 前…

Pandas DataFrame中将True/False映射到1/0

在本文中,我们将看到如何在Pandas DataFrame中将True/False映射到1/0。True/False到1/0的转换在执行计算时至关重要,并且可以轻松分析数据。 1. replace方法 在这个例子中,我们使用Pandas replace()方法将True/False映射到1/0。在这里&…

【Spark精讲】记一个SparkSQL引擎层面的优化:SortMergeJoinExec

SparkSQL的Join执行流程 如下图所示,在分析不同类型的Join具体执行之前,先介绍Join执行的基本框架,框架中的一些概念和定义是在不同的SQL场景中使用的。 在Spark SQL中Join的实现都基于一个基本的流程,根据角色的不同&#xff0…

信息论与编码期末复习——计算题+基础汇总(二)

个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…

【计算机毕业设计】SSM网上外卖订餐管理系统

项目介绍 该项目为前后台项目,分为普通用户与管理员两种角色,前台普通用户登录,后台管理员登录; 普通用户主要功能包括: 登录注册,查看商品,提交订单,然后留言,查看购物…

DS|静态查找

题目一:DS静态查找 -- 顺序查找 题目描述: 给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始 要求使用带哨兵的顺序查找算法 输入要求: 第一行输入n,表示队列有n个数据 第二行输入…

CAN通信的基本原理与实现方法

一. CAN协议概念 1.1 CAN 协议简介 CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519以及ISO11898),是国际上应用最广泛的现场总线之一。差异点如下&…