数据结构 模拟实现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.hqwc.cn/news/326885.html

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

相关文章

解决 POST http://x.x.x.x:8000/aaa/ net::ERR_CONNECTION_TIMED_OUT

记录一下我遇到的问题和解决办法 我的项目前后端分离,在前端用的vue访问后端时连接不上后端,一切操作都触发不了后端,数据也传不到后端去; 原因:url有问题,url地址写的不是本机,所以导致连接超…

python 深度学习 记录遇到的报错问题11

本篇继python 深度学习 记录遇到的报错问题10-CSDN博客 六、ValueError: cannot convert float NaN to integer 报错: 原因:这个错误通常是因为在尝试将NaN值转换为整数时发生的。NaN表示“非数字”,它无法转换为整数。在 Python 中&#xf…

单调栈模版

单调栈需要两个数组,一个值数组,一个模拟栈数组,拿一道题来举例。 模拟栈数组中存储下标,单调栈顾名思义单调增或者单调减,并不是索引单调增或者单调减,这意义,我们要的是索引对应的值单调增或者…

使用Spring Cache优化数据库访问

使用Spring Cache优化数据库访问 在这篇博客中,我们将学习如何使用Spring Cache来优化数据库访问,提高系统性能。我们将创建一个简单的图书管理应用作为示例,并演示如何通过缓存减少对数据库的频繁查询。 1. 项目结构 首先,我们…

全网最强的Spring源码入门教程(包含IOC、AOP、事务、MVC)

一. ioc 1.1 bd的收集 1.1.1 基于xml 入口 AbstracApplicationtContext.refresh -> AbstracApplicationtContext.obtainFreshBeanFactory() -> 调用到子类 AbstractRefreshableApplicationContext.loadBeanDefinitions() -> AbstractXmlApplicationContext.loadBeanDe…

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

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

macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系”

macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系” 网络问题系统时间问题镜像索引问题 网络问题 系统时间问题 镜像索引问题 恢复模式的 “实用工具 > 系统终端” 里执行如下 nvram IASUCatalogURLhttps://swscan.apple.com/content/catalogs/others/i…

Python 面向对象之反射

Python 面向对象之反射 【一】概念 反射是指通过对象的属性名或者方法名来获取对象的属性或调用方法的能力反射还指的是在程序额运行过程中可以动态获取对象的信息(属性和方法) 【二】四个内置函数 又叫做反射函数 万物皆对象(整数、字符串、函数、模块、类等等…

Unity中Shader序列帧动画(总结篇)

文章目录 前言一、半透明混合自定义调整1、属性面板2、SubShader中3、在片元着色器(可选)3、根据纹理情况自己调节 二、适配Build In Render Pipeline三、最终代码 前言 在前几篇文章中,我们依次解决了实现Shader序列帧动画所遇到的问题。 Unity中Shader序列图动画…

欧系数学一眼假系列7.“欧拉常数”是弥天大谎

数学界一直在干一件令人恶心的丑事:明明我求的是Σ1/708249541360742487,它给的答案却是ln7082495413607424870.5772156649(欧拉常数,通常以C表示),门外汉皆以为Σ1/n→∞是正经结论,全然不知它无关Σ1/n,而…

Geoserver扩展发布MySQL视图功能

Geoserver中并不自带mysql数据发布功能,需要扩展外部插件。 1、示例以geoserver-2.20.5版本进行演示,所以MySQL插件需要到该版本对应的“Extensions”标题下查找,下载地址:GeoServer,详见下图 2、选择MySQL进入下载页…

解决:TypeError: ‘tuple’ object does not support item assignment

解决:TypeError: ‘tuple’ object does not support item assignment 文章目录 解决:TypeError: tuple object does not support item assignment背景报错问题报错翻译报错位置代码报错原因解决方法方法一:方法二:今天的分享就到…