【Java】/* 双向链式队列 和 循环队列 - 底层实现 */

news2024/11/16 9:20:25

一、链式队列

1. 使用双向链表实现队列,可以采用尾入,头出 也可以采用 头入、尾出 (LinkedList采用尾入、头出)

2. 下面代码实现的是尾入、头出:

package bageight;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: tangyuxiu
 * Date: 2024-08-22
 * Time: 16:44
 */
public class MyQueue<E> {
    /* 使用内部类实现链表的节点 */
    private class ListNode<E> {
        E val;
        ListNode<E> prev;
        ListNode<E> next;

        public ListNode(E val) {
            this.val = val;
        }
    }

    private ListNode<E> head;
    private ListNode<E> last;

    /* push尾入 */
    public void offer(E data) {
        ListNode<E> newNode = new ListNode<>(data);
        //1. 如果链表为null
        if (this.head == null) {
            this.head = this.last = newNode;
            return;
        }
        //2. 尾插
        this.last.next = newNode;
        newNode.prev = this.last;
        this.last = newNode;
    }

    /* poll头出 */
    public E poll() {
        //1. 如果链表为null
        if (this.head == null) {
            return null;
        }
        //2. 头出
        E del = this.head.val;
        if (this.head.next == null) {//链表只有一个节点
            this.head = this.last = null;
        } else {//链表有多个节点
            this.head = this.head.next;
            this.head.prev = null;
        }
        return del;
    }

    /* peek */
    public E peek() {
        //1. 如果链表为null
        if (this.head == null) {
            return null;
        }
        //2. 正常
        return this.head.val;
    }

    /* size */
    public int size() {
        int count = 0;
        ListNode<E> cur = this.head;
        while (cur != null) {
            count++;
            cur = cur.next;
        }
        return count;
    }
}

二、循环队列

622. 设计循环队列 - 力扣(LeetCode)

【难点】:

① 到底怎么判断什么时候队列为null,什么时候队列满了

② fast++,如何不越界:fast = fast % len 或 第三种做法要写成fast = (fast + 1) % len

【等待补充】使用flag的方式如何编写代码。

2.1 使用uesdSize判断空满

class MyCircularQueue {
    private int[] elem;//由于不是泛型类,且依据题意放入数组中的数据都是int类型的,
                       //因此如此定义
    private int head;//队头位置
    private int last;//待插入数据位置
    private int uesdSize;//队列有效数据个数

    public MyCircularQueue(int k) {
        this.elem = new int[k];
    }
    
    //尾插
    public boolean enQueue(int value) {
        if (this.isFull()) {
            return false;
        }

        this.elem[this.last] = value;
        this.last++;
        //使得last的下标一直维持在0~elem.length-1
        this.last = this.last % this.elem.length;
        this.uesdSize++;
        return true;
    }
    
    //头删
    public boolean deQueue() {
        if (this.isEmpty()) {
            return false;
        }

        //头删是让head的值++,而不是--🙀
        this.head++;
        this.head = this.head % this.elem.length;
        this.uesdSize--;
        return true;
    }
    
    //获取队头元素的值
    public int Front() {
        if (this.isEmpty()) {
            return -1;
        }

        return this.elem[this.head];
    }
    
    //获取队尾元素的值
    public int Rear() {
        if (this.isEmpty()) {
            return -1;
        }

        if (this.last == 0) {
            return this.elem[this.elem.length - 1];
        } 
        return this.elem[this.last - 1];
    }
    
    public boolean isEmpty() {
        return this.uesdSize == 0;
    }
    
    public boolean isFull() {
        return this.uesdSize == this.elem.length;
    }
}

2.2 浪费一个数组空间来判断空满

class MyCircularQueue {
    private int[] elem;//由于不是泛型类,且依据题意放入数组中的数据都是int类型的,
                       //因此如此定义
    private int head;//队头位置
    private int last;//待插入数据位置

    public MyCircularQueue(int k) {
        this.elem = new int[k + 1];
    }
    
    //尾插
    public boolean enQueue(int value) {
        if (this.isFull()) {
            return false;
        }

        this.elem[this.last] = value;
        this.last++;
        //使得last的下标一直维持在0~elem.length-1
        this.last = this.last % this.elem.length;
        return true;
    }
    
    //头删
    public boolean deQueue() {
        if (this.isEmpty()) {
            return false;
        }

        //头删是让head的值++,而不是--🙀
        this.head++;
        this.head = this.head % this.elem.length;
        return true;    
    }
    
    //获取队头元素的值
    public int Front() {
        if (this.isEmpty()) {
            return -1;
        }

        return this.elem[this.head];
    }
    
    //获取队尾元素的值
    public int Rear() {
        if (this.isEmpty()) {
            return -1;
        }

        if (this.last == 0) {
            return this.elem[this.elem.length - 1];
        } 
        return this.elem[this.last - 1];
    }
    
    public boolean isEmpty() {
        return this.head == this.last;
    }
    
    public boolean isFull() {
        return (this.last + 1) % this.elem.length == this.head;//🙀,想一想特殊情况就知道为什么这么写了
    }
}

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

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

相关文章

[kaggle竞赛] 毒蘑菇的二元预测

毒蘑菇的二元预测 您提供了很多关于不同二元分类任务的资源和链接&#xff0c;看起来这些都是Kaggle竞赛中的参考资料和高分解决方案。为了帮助您更好地利用这些资源&#xff0c;这里是一些关键点的总结&#xff1a; Playground Season 4 Episode 8 主要关注的竞赛: 使用银行…

2024/8/22 英语每日一段

Belgian triathlete Claire Michel ultimately said it was a virus and not bacteria from the water that made her sick after a swim. But Belgium’s Olympic committee said in a statement that it hoped “lessons will be learned” for future Olympics. “We are th…

鸿蒙(API 12 Beta3版)【使用ImageEffect编辑图片】图片开发指导

场景介绍 ImageEffect提供了一系列接口用于图像的编辑。开发者可以通过ImageEffect接口处理不同图像输入类型Pixelmap、NativeWindow、NativeBuffer或Uri&#xff0c;获得滤镜处理效果。 针对ImageEffect&#xff0c;常见的开发场景如下&#xff1a; 通过ImageEffect提供的N…

iOS 18 Beta 7测试版本体验,无新功能,修复已知bug

近日苹果公司发布了iOS 18 beta7版本&#xff0c;版本号22A5346a。那iOS 18beta7版本是否比其他的测试版要更好用呢&#xff1f;以下测试结果仅供果粉参考&#xff0c;一机一况&#xff0c;以个人实际体验为准。 一、日常使用体验 1、App响应非常快&#xff0c;动画过渡时间稍…

【高等代数笔记】线性方程组的解法(三、四、五)

1. 线性方程组的解法 由于这个视频课的分p十分抽象&#xff0c;我还是把一节完整的课学完再发表笔记吧&#xff0c;要不然太零碎了。 接上一篇文章 阶梯形方程组为 { x 1 − x 2 2 x 3 − 1 0 0 \left\{\begin{array}{l} x_{1}-x_{2}2 \\ x_{3}-1 \\ 00 \end{array}\righ…

dll错误修复工具:一键解决系统DLL错误产生的程序问题(新手入门)

dll错误修复工具&#xff0c;主要解决导致Windows系统上程序出错的各种dll相关问题。金舟DirectXDLL一键修复提供了全面的且快速的扫描功能&#xff0c;能够检测出导致程序故障的任何dll错误&#xff0c;并且一键进行修复。 一、什么是dll文件 dll是系统的动态链接库文件&…

6年赚了300亿孙悟空才是真财神!带火文旅、引发装机热潮、搅动A股....这波热度你蹭到了吗?

《黑神话&#xff1a;悟空》上线后一博主连续32小时直播&#xff0c;观看人数超3000万&#xff0c;涨粉近46万&#xff01;该主播个人收益或高达85万元&#xff01;游戏里的36个取景地中&#xff0c;山西独占27个。8月20日&#xff0c;小西天景区出售门票比去年同期增长300%。 …

前端面试题-vue框架

1. 聊聊为什么会出现 React、vue 这样的框架&#xff0c;他们的出现解决了什么问题 用户界面越来越复杂&#xff0c;框架采用声明式的写法&#xff0c;将界面的构建和数据的管理分离出来&#xff0c;大大提升开发效率和维护效率。 &#xff08;1&#xff09;原生JS实现不太方…

如何在Visio中画精准的圆弧,角度标记,弧度标记(已解决)

1、导入 “绘图工具形状” 打开 Visio--》 然后&#xff1a; 点击 绘制工具形状 之后&#xff0c; 在界面会出现 绘制工具形状的选项 如下 本人 使用圆弧 &#xff0c;弧线功能&#xff0c;然后两头增加箭头&#xff0c;实现角度标注&#xff0c;如下

【Qt开发】建立自己的Qt基本类、函数库封装 包括图表、多线程、串口等

【Qt开发】建立自己的Qt基本类、函数库 包括图表、多线程、串口等 文章目录 前言QtCharts绘图继承QObject的QThread多线程QSerialPort串口配置、发送、接收回调函数附录&#xff1a;C语言到C的入门知识点&#xff08;主要适用于C语言精通到Qt的C开发入门&#xff09;C语言与C的…

2024年企业记账最主流的8大财务软件大对比

企业记账的8大主流财务软件&#xff1a;1.合思&#xff1b;2.用友好会计财务软件&#xff1b;3.浪潮云会计&#xff1b;4.金蝶精斗云财务软件&#xff1b;5.Zoho Books&#xff1b;6.管家婆&#xff1b;7.QuickBooks&#xff1b;8.云账房。 对小企业主来说&#xff0c;采用高效…

Linux | 探究C语言文件接口与Linux系统文件接口的区别与联系 | fopen和open的区别与联系

什么是尘土&#xff1f;从大地之肺发出的一声叹息。 - 《阿多尼斯诗集》(阿多尼斯) 2024.8.23 目录 1、C语言IO接口 示例代码&#xff1a;使用 fopen 和 fclose 读写文件 示例1&#xff1a;通过write写文件 示例2&#xff1a;通过read写文件 C语言的标准流&#xff1a;std…

集合及数据结构第十节(上)————优先级队列,堆的创建、插入、删除与用堆模拟实现优先级队列

系列文章目录 集合及数据结构第十节&#xff08;上&#xff09;————优先级队列&#xff0c;堆的创建、插入、删除与用堆模拟实现优先级队列 优先级队列&#xff0c;堆的创建、插入、删除与用堆模拟实现优先级队列 优先级队列的概念堆的概念堆的存储方式堆的创建变量的作…

谷粒商城实战笔记-250-商城业务-消息队列-RabbitMQ安装-Docker

一&#xff0c;docker安装RabbitMq RabbitMQ 是一个开源的消息代理软件&#xff0c;广泛用于实现异步通信和应用程序解耦。 使用 Docker 容器化技术可以简化 RabbitMQ 的安装和部署过程。 以下是使用 Docker 安装 RabbitMQ 的详细步骤。 步骤 1: 安装 Docker 如果您的系统…

Linux 软件编程 网络 tcp

1.TCP粘包问题&#xff1a; TCP发送数据是连续的&#xff0c;两次发送的数据可能粘连成一包被接收到 1.解决粘包问题方法&#xff1a; 1.接收指定长度&#xff1a;&#xff08;不稳定&#xff09; 发送5个字节 接收5个字节 2.睡眠&#x…

【数据库】Mysql 批量变更所有字段类型为varchar的字符集

生成变更语句 SELECT CONCAT(ALTER TABLE , TABLE_NAME, MODIFY , COLUMN_NAME, , COLUMN_TYPE, , CHARACTER SET utf8 COLLATE utf8_general_ci , CASE WHEN IS_NULLABLE YES THEN NULL DEFAULT NULL WHEN IS_NULLABLE NO AND ISNULL(COLUMN_DEFAULT) THEN NOT NULL EL…

Adobe Illustrator矢量绘图软件win/mac软件下载安装

一、软件概述 1.1 Adobe Illustrator简介 Adobe Illustrator是一款由Adobe Systems开发的强大矢量绘图软件&#xff0c;专为设计师、艺术家及图形专家设计。它广泛应用于平面设计、插画、UI设计、图标设计、排版及数字媒体制作等领域。Illustrator以其独特的矢量图形处理能力…

Datawhale X 魔搭 AI夏令营第四期 | AIGC文生图——进阶上分 实战优化 Task3笔记

Hi&#xff0c;大家好&#xff0c;我是半亩花海。在上一个任务中&#xff0c;我们逐行精读baseline&#xff0c;掌握了利用AI工具提升学习效率&#xff0c;并制作了话剧连环画&#xff0c;初步了解Secpter WebUI。今天&#xff0c;我们将深入探讨微调的基本原理及其参数&#x…

海外版多语言互助盘三三复制超级人脉系统

此套源码是全新二开的超级人脉系统&#xff0c;面向海外操作新增多语言&#xff0c;后台可新增其他语言.

【图机器学习系列】(二)从传统机器学习角度理解图(一)

微信公众号&#xff1a;leetcode_algos_life&#xff0c;代码随想随记 小红书&#xff1a;412408155 CSDN&#xff1a;https://blog.csdn.net/woai8339?typeblog &#xff0c;代码随想随记 GitHub: https://github.com/riverind 抖音【暂未开始&#xff0c;计划开始】&#xf…