【java-数据结构19-队列的模拟实现】

  上篇文章,小编已经带大家一起认识了队列,并且对队列的方法进行调用测试,下面我们将模拟实现一个队列,话不多说,上正文~

1.队列的模拟实现

  队列的实现方法和链表的实现方式一模一样,这里我们首选双链表,前驱,后继,参数,头,尾,构造方法,这里就不多做赘述了,直接上代码~

public class MyQueue {static class ListNode{private int val;private ListNode prev;private ListNode next;public ListNode(int val){this.val = val;}}private ListNode front;private ListNode rear;public int usedSize ;
}

2.插入数据

  这里我们要用到的是头插法,前面提到。我们自己模拟实现的队列底层是一个双向链表,那么双向链表的头插我们前面也提到过,这里我们再复述一遍~

 这里我们先定义一个 node节点,如图

接下来就是改节点,和具体代码

 然而,只是这样,我们还忘记了一个重要细节,如果head为空,那么node就是整个链表的头,也是整个链表的尾,如图

代码如下

 public void offer(int x){ListNode node = new ListNode(x);if(front == null) {front = rear = node;}else {node.next = front;front.prev = node;front = node;}usedSize++;}
}

调用测试

 public static void main(String[] args) {MyQueue myQueue = new MyQueue();myQueue.offer(1);myQueue.offer(2);myQueue.offer(3);myQueue.offer(4);System.out.println();}

运行截图

 注意,由于我们是头插法,实际存储数据为:4,3,2,1

3.弹出数据 

1.删第一个数据(此方法比较不合理,不常用,大家了解即可,下面的删除头节点才是重点)

  同样的,双向链表一样,考虑没有节点的情况(直接返回或抛出异常),只有一个节点的情况(将头,尾全部置空),和普通情况(front向后走,front前驱置为空)

代码如下

 public int pop(){//没有节点if (front == null){return -1;}int ret = front.val;//存下数据//只有一个节点if (front == rear){front= null;rear = null;usedSize--;}//至少有两个节点front=front.next;front.prev = null;usedSize--;return ret;}

调用测试

public static void main(String[] args) {MyQueue myQueue = new MyQueue();myQueue.offer(1);myQueue.offer(2);myQueue.offer(3);myQueue.offer(4);System.out.println();System.out.println(myQueue.pop());}

运行截图

2.删除最后一个元素 (这个才是重点)

同上,没有元素直接返回即可,只有一个元素(全部置空),普通情况(rear等于前驱,rear置为空),此时存下的数据也要改变

代码如下

 public int pop(){//没有节点if (front == null){return -1;}int ret = rear.val;//存下数据//只有一个节点if (front == rear){front= null;rear = null;usedSize--;}//至少有两个节点rear = rear.prev;rear.next = null;usedSize--;return ret;}

调用测试

public class test {public static void main(String[] args) {MyQueue myQueue = new MyQueue();myQueue.offer(1);myQueue.offer(2);myQueue.offer(3);myQueue.offer(4);System.out.println();System.out.println(myQueue.pop());}
}

运行截图

4.获取队头元素 

  首先判空,如果为空,返回-1,如果不为空,返回front的值即可

代码如下

 public int peek(){if (front == null){return -1;}return front.val;}

调用测试

public class test {public static void main(String[] args) {MyQueue myQueue = new MyQueue();myQueue.offer(1);myQueue.offer(2);myQueue.offer(3);myQueue.offer(4);System.out.println();System.out.println(myQueue.peek());}
}

运行截图

5.返回元数个数,判空 

两种方法不复杂,一个直接返回有效元素个数,一共看usedSize是否为零,代码如下

  public int getUsedSize() {return usedSize;}public boolean isEmpty(){return usedSize == 0;}

调用测试

public static void main(String[] args) {MyQueue myQueue = new MyQueue();myQueue.offer(1);myQueue.offer(2);myQueue.offer(3);myQueue.offer(4);System.out.println();System.out.println(myQueue.getUsedSize());System.out.println(myQueue.isEmpty());}

运行截图

那么到此为止,本篇文章就到此结束啦~下一篇文章我们将继续学习队列的相关知识,敬请期待叭~觉得小编讲的还可以的可以留个关注支持一下,谢谢观看~

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

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

相关文章

VirtualBox虚拟机与bhyve虚拟机冲突问题解决@FreeBSD

问题 在安装完bhyve虚拟系统的主机上启动VirtualBox虚拟机的时候,报错:不能为虚拟电脑 debian 打开一个新任务. VirtualBox cant operate in VMX root mode. Please close all other virtualization programs. (VERR_VMX_IN_VMX_ROOT_MODE). 返回 代码…

UWP与WPF:微软两大UI框架

在微软的开发者生态系统中,UWP(Universal Windows Platform)与WPF(Windows Presentation Foundation)是构建Windows应用的两大明星框架。它们各自携带独特的设计理念和技术特性,服务于不同的开发需求和应用场景。本文将深入探讨这两者之间的异同&#xf…

项目成功的关键要素:进度管理

在项目管理中,进度管理是决定项目成败的关键因素之一。它关乎项目能否在预定的时间范围内高效、准确地完成既定目标。 一、进度管理的重要性 1、时间控制:项目的成功往往与时间的把握息息相关。进度管理能够确保项目在既定的时间框架内有序进行&#x…

uni-app学习完结

昨天空余一天,并未写记录,是昨天属于项目完结,这里把最后的打包上线等这里说下。 打包成微信小程序 打包成微信小程序,这需要再微信公众平台里面,进行登陆和设置。这里说下,注册的后,选择需要…

LeetCode---链表

203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 代码示例1:(直接使用原来的链表来进行移除节点操作) //时间复杂度: O(n) //空间复杂度: O(1) class Solu…

算法训练营36

题目1&#xff1a; 根据通过情况反复挑战最终AC过了&#xff0c;这里和原来的差别是他的排序是用绝对值排序的&#xff0c;这样的思路会很简单 class Solution { public:int largestSumAfterKNegations(vector<int>& nums, int k) {sort(nums.begin(), nums.end())…

数据通信基本概念汇总

1. 数据通信基础 网关: 提供协议转换&#xff0c;路由选择&#xff0c;数据交换的网络设备 报文: 网络中所传递的一个数据单元。 数据载荷: 最终要传递的信息 封装: 给数据载荷添加头部和尾部的过程(形成新的报文) 解封装: 给数据载荷去掉头部和尾部的过程(获取数据载荷) 终端设…

C语言中的位段

位段是通过结构体实现的&#xff0c;可以在一定程度上减小空间浪费&#xff0c;位段的声明和结构体类似&#xff0c;有以下几个不同&#xff1a; ①位段的成员必须是整形&#xff08;int,char,short等&#xff09;。 ②成员后边有冒号和数字&#xff0c;表示该成员占几个bit位…

LeetCode---栈与队列

232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int pee…

深入理解Java面向对象设计的六大原则

目录 单一职责原则&#xff08;SRP&#xff09; 开放封闭原则&#xff08;OCP&#xff09; 里氏替换原则&#xff08;LSP&#xff09; 依赖倒置原则&#xff08;DIP&#xff09; 接口隔离原则&#xff08;ISP&#xff09; 迪米特法则&#xff08;LoD&#xff09; 结语 …

Mac快速搭建前端环境创建前端项目【Vue】

Mac快速搭建前端环境&创建前端项目 官网&#xff1a; vue&#xff1a;https://cn.vuejs.org/vue-router&#xff1a;https://www.axios-http.cn/pinia&#xff1a;https://pinia.vuejs.org/zh/getting-started.htmlaxios&#xff1a;https://www.axios-http.cn/ant-design&…

Advanced Installer 问题集锦

1、界面在主题中显示的图标&#xff0c;如logo、发布者名称、产品名称就算在设计界面时删除&#xff0c;但是下次打开工程依然存在 解决办法&#xff1a;“可见”属性设置为禁用 2、在不关闭软件的情况下&#xff0c;使用"文件->打开"来切换项目&#xff0c;再次…

c++按索引同时删除多个元素

文章目录 代码结果 这个时候不能从前往后删&#xff0c;因为会破坏後面的元素的索引值&#xff0c;比如如果第删除了第2个元素&#xff0c;第3个元素的索引就会变为第2个元素的索引&#xff0c;造成混乱&#xff0c;甚至引起程序崩溃。应该从後往前删。 代码 #include<iost…

学习笔记——数据通信基础——数据通信网络(基本概念)

数据通信网络基本概念 网络通信&#xff1a;是指终端设备之间通过计算机网络进行的通信。 数据通信网络(Data Communication Network)&#xff1a;由 路由器、交换机、防火墙、无线控制器、无线接入点&#xff0c;以及个人电脑、网络打印机&#xff0c;服务器等设备构成的通信…

软考 系统架构设计师系列知识点之杂项集萃(21)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;20&#xff09; 第30题 软件结构化设计包括&#xff08; &#xff09;等任务。 A. 架构设计、数据设计、过程设计、原型设计 B. 架构设计、过程设计、程序设计、原型设计 C. 数据设计、过程设…

探秘GPT-4o:人工智能语言模型的新纪元

目录 前言1 GPT系列版本演变1.1 GPT-1到GPT-3的演变1.2 GPT-4的引入 2 GPT-4o与GPT-4的区别2.1 参数规模和架构优化2.2 训练数据和方法改进2.3 多模态能力 3 GPT-4o在语言生成和理解方面的技术能力3.1 更自然的语言生成3.2 更深刻的语境理解3.3 强大的跨语言能力3.4 自适应学习…

服务器硬件基础知识全面解析

在信息技术领域&#xff0c;服务器作为支撑各类业务运行的基石&#xff0c;其稳定性和性能至关重要。服务器硬件作为服务器的核心组成部分&#xff0c;直接决定了其处理能力、可靠性和扩展性。本文将深入浅出地介绍服务器硬件的基础知识&#xff0c;帮助IT专业人士及对服务器技…

git都在自己的个人分支开发吗?功能分支和个人分支工作流

在实际的开发过程中&#xff0c;使用分支的策略可以根据项目的需求和团队的工作流程进行调整。以下是两种常见的分支策略&#xff1a; 1. 功能分支&#xff08;Feature Branches&#xff09; 每个功能或修复一个独立的分支。这种方法通常被称为“功能分支工作流”。 优点 隔…

如何通过手机自学编程入门:探索四、五、六、七方面的学习路径

如何通过手机自学编程入门&#xff1a;探索四、五、六、七方面的学习路径 在信息爆炸的时代&#xff0c;手机已不仅仅是通讯工具&#xff0c;更是知识的宝库和学习的利器。对于渴望入门编程的初学者来说&#xff0c;手机自学编程成为了一种便捷而高效的选择。本文将围绕四个方…

【Unity Shader入门精要 第11章】让画面动起来(一)

1. Unity Shader中的时间变量 Shader控制这物体的显示&#xff0c;当向Shader中引入时间变量后&#xff0c;就可以让物体的显示效果随时间发生变化&#xff0c;以实现动画效果。 Unity中常见的时间变量如下表&#xff1a; 变量类型描述_Timefloat4(t/20, t, 2t, 3t)&#xf…