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

news2024/11/15 20:54:16

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

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.coloradmin.cn/o/1713056.html

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

相关文章

MT2075 礼物

思路: x,y为质数,若x2,y3,则xy的最小公倍数6既不能给A也不能给B。 所以假设共有V个数,在1-V中,可以选的个数为:V-⌊V/(x*y)⌋ 个。(⌊V/(x*y)⌋为V个数中有多少个xy的公倍数) 所以…

股票量化交易上手,一个特别简单却长期可用的交易策略,官方接口

股票实现程序化自动化交易的三个基础:获取数据、执行交易、查询账户。 以后说到策略示例的时候就不介绍接口的基础使用方法了,随便一个策略把过程写出来都会很啰嗦,尽量压缩内容吧,这些内容是面向新手的,大佬们忽略细节…

护眼落地台灯十大知名品牌哪款最好?十大经典落地灯品牌推荐

护眼落地灯十大知名品牌哪款最好?随着快经济时代的到来,人们在学业以及事业上的压力也日益增加,不少朋友反应在日常工作、学习是经常出现眼部疲劳的状况,甚至会时不时出现眼睛干涩、流泪,对学习、工作状态造成了极大的…

【全开源】知识付费问答社区(FastAdmin+ThinkPHP)

此系统是一款基于FastAdmin和ThinkPHP开发的知识付费问答社区系统,提供全部前后台无加密源代码,拥有强大的付费提问、付费阅读、付费查看、付费邀请、全文搜索等功能模块,其整合了强大的标签模块和专区模块,让问题和文章更好的归类…

删除的短信怎么恢复?专业与非专业方法的全面比较

在日常清理手机内存的过程中,我们可能会不小心删除短信。这些短信可能包含重要的数据和联系人信息。面对这种情况,许多人会感到困惑和无助。那么,删除的短信怎么恢复呢?本文将为您全面比较专业与非专业的方法,帮助您找…

【信息学奥赛】两个整型变量的值交换

【信息学奥赛】两个整型变量的值交换 💖The Begin💖点点关注,收藏不迷路💖 编写如下一个函数,用于将两个整型变量的值交换 输入: 两个数 输出: 交换后的两个数 样例输入: 3 2样…

Redis学习篇3:缓存更新策略与数据更新、淘汰策略

一、缓存更新策略 二、主动更新 三、过期策略 3.1 如何知道过期? 3.2 删除策略 四、内存淘汰策略 数据淘汰策略-使用建议 一、缓存更新策略 Redis是基于内存的数据库,它的优点就是在对数据进行操作的时候快,并且通过…

【全开源】驾校管理系统源码(FastAdmin+ThinkPHP)

一款基于FastAdminThinkPHP开发的驾校管理系统,驾校管理系统(DSS)主要面向驾驶学校实现内部信息化管理,让驾校管理者和工作人员更高效、更快捷的完成枯燥无味的工作,让工作更有条理。改变驾校传统的手工或半手工Excel文档管理的工作方式。多驾…

深入探索C++继承机制:从概念到实践的全面指南

目录 继承的概念及定义 继承的概念 继承的定义 定义格式 继承方式和访问限定符 继承基类成员访问方式的变化 默认继承方式 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 继承的方式 菱形虚拟继承 菱形虚拟继承原理 继承…

vue项目关于loading问题

前言 因全局加loading会出现全白屏的遮罩层,影响美观,所以一般考虑局部加loading,比如是表格,表单等就加上loading 解决办法 v-loading“loading” element-loading-background“rgba(255, 255, 255, 0.6)” const loading re…

精酿啤酒:品质与口感在消费者选择中的权重分析

在啤酒市场中,消费者选择的影响因素众多,其中品质与口感是两个核心要素。对于Fendi club啤酒而言,品质与口感的权重分析在消费者选择中显得尤为重要。 品质是消费者选择啤酒的首要因素。随着消费者对啤酒认知的提高,他们对品质的…

论文《Sensor and Sensor Fusion Technology in Autonomous Vehicles: A Review》详细解析

论文《Sensor and Sensor Fusion Technology in Autonomous Vehicles: A Review》详细解析 摘要 该论文对自动驾驶汽车中的传感器和传感器融合技术进行了全面回顾。它评估了各种传感器(如相机、LiDAR、雷达)的能力和技术性能,并讨论了多传感…

c++11特性(详细)

文章目录 前言一、C11介绍二、列表初始化1.{}初始化2.initializer_list 三、auto与decltype四、STL中变化五、右值引用六.C中关于类的新功能七.可变参数模板八.lambda表达式总结 前言 在本篇文章,我们将会详细介绍一下C11新增的一些特性,其中最重要的是…

有1,2,3,4这四个数字,能组成多少个互不相同且无重复数字的三个数?分别是什么?

有1,2,3,4这四个数字,能组成多少个互不相同且无重复数字的三个数?分别是什么? 提示:123,321就是符合要求,数字既不相同,而且每个数字的个十百位也不重复;而121,212就不行&#xff0c…

Facebook海外三不限企业广告账户-Facebook的ROI是什么?

1. 什么是ROI? ROI是指投资回报率(Return on Investment),是衡量投资效益的一种指标。在市场营销领域,ROI是一个非常重要的概念,用于衡量营销活动的效果和价值。它通常用于评估一项投资的效益,即…

获取和设置代理的动态IP的方式

引言 大家好,今天我来给大家分享一下如何通过编程技术来获取和设置代理的动态IP。在网络世界中,代理和动态IP是非常常见的概念,尤其对于需要大规模访问网站或者需要隐藏真实IP地址的应用程序来说,更是必不可少的工具。接下来&…

钛媒体首发 | 百度沈抖回应大模型价格战:希望大家别再天天拉表格比价格

ITValue “有这个时间,不如去卷场景、卷应用。” 作者|张帅 编辑|盖虹达 首发|钛媒体APP ITValue 钛媒体App 5月28日消息,在2024智能经济论坛上,百度集团执行副总裁、百度智能云事业群总裁沈抖介绍了文心系…

视频监控业务平台LntonCVS运用国标协议对接视频汇聚管理综合平台应用方案

为了实现“以信息化推动应急管理能力现代化”的目标,应急管理部提出了加速现代信息技术与应急管理业务深度融合的计划。这一计划是国家加强和改进应急管理工作的关键举措,也是满足日益严峻的应急管理形势和人民群众不断增长的公共安全需求的紧迫需求。 为…

qq音乐sign逆向

qq音乐sign参数逆向 1.概览 参数sign长度40 多次调试发现,前缀zzb不变 2.打日志 跟站发现是vpm,在apply调用打上日志断点: 连蒙带猜知道,最终字符串四部分构成,zzb 24DC2798 HI0TvE4tOMqzN4w88oZCjQ EE0A88FE 1.把…

云平台教程 | 手把手教你GSEA富集分析和解读

爱基百客云平台小工具使用 1.1 爱基百客云平台之GSEA分析 1.2 GSEA富集分析原理图 1.3 GSEA富集分析过程 1.4 参数设置 1.5 任务查看 1.6 结果 1.6.1 富集结果表格 1.6.2 富集可视化图解读 01 爱基百客云平台小工具使用 首先,打开爱基百客官网:http://w…