【Java数据结构】---Queue

news2024/9/19 10:46:27

乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen

我的专栏:c语言 ,Java

欢迎大家访问~
创作不易,大佬们点赞鼓励下吧~

文章目录

  • 前言
  • 队列Queue
  • 队列的模拟实现
  • 环形队列
  • 队列练习
  • Deque双端队列
  • 完结

前言

在这里插入图片描述
由图可知:Queue接口一定意义上和List接口“平级”

注意一个细节, LinkedList不仅属于List接口下的类,也属于Queue接口下的类 。根据上篇博客所说,链表与数组都可以模拟栈,而栈也是List接口下的类。

队列Queue

队列:只允许在一端进行插入数据操作在另一端进行删除数据操作的特殊线性表。

入队列(Enqueue):进行插入操作的一端称为队尾
出队列(Dequeue):进行删除操作的一端称为队头
队列具有先进先出的特性

在这里插入图片描述
大家可以简单理解为日常生活中“排队”这一现象。

队列的模拟实现

简单想一想,因为LinkedList实现了Queue接口,所以Queue的底层是由链表实现的。

受到LinkedList的影响,我们下意识认为Queue的底层是双向链表,那单链表能不能来实现队列呢?
在这里插入图片描述
那么以LinkedList来实现队列怎么样呢?
建立内部类

//内部类
    public static class ListNode {
        public ListNode prev;
        public ListNode next;
        int value;

        ListNode(int value){
            this.value=value;
        }
    }

    public ListNode first=null;
    public ListNode last=null;
    int Usedsize=0;

入队列—向双向链表位置插入新节点

public void offer(int val){
        ListNode node=new ListNode(val);
        if(first==null){
            first=last=node;
        }else{
            last.next=node;
            node.prev=last;
        }
        last=node;
        Usedsize++;
    }

出队列—将双向链表第一个节点删除掉

public int poll(){
        int val=0;
        if(first==null){
            return 0;
        }
        if(first==last){
            last=null;
            first=null;
        }else{
            val=first.value;
            first=first.next;
            first.prev.next=null;
            first.prev=null;
        }
        Usedsize--;
        return val;
    }

在这里插入图片描述

获取队头元素—获取链表中第一个节点的值域

public int peek(){
        if(first==null){
            return 0;
        }
        return first.value;
    }

环形队列

一般情况下,环形队列通常使用数组实现

画图介绍一下环形队列:
在这里插入图片描述
判断空:rear与front第一次相遇就为空
判断满:

  1. 定义一个有效大小usedsize,如果它和数组大小相同,那队列就满了
  2. 添加标记,定义一个标记符。rear与front相遇为false,添加一个元素改为true,当rear与front相遇且标记符为true时为满。
  3. 浪费一个空间,判断rear的下一个是不是front(rear+1=front)

在这里插入图片描述

最重要的一个问题,rear或者front下标怎么样从 7下标 到 0下标 ? 总不能去rear+1。。。

当rear下标为 7 时 :(rear+1)%len,(len为数组长度)。由此实现循环

队列练习

设计循环队列

class MyCircularQueue {

    public int front;
    public int rear;
    public int[] elem;

    public MyCircularQueue(int k) {
        elem=new int[k+1];
    }
    
    public boolean enQueue(int value) {
        if(isFull()){
            return false;
        }
        elem[rear]=value;
        rear=(rear+1) % elem.length;
        return true;
    }
    
    public boolean deQueue() {
        if(isEmpty()){
            return false;
        }
        front=(front+1)%elem.length;
        return true;
    }
    
    public int Front() {
        if(isEmpty()){
            return-1;
        }
        return elem[front];
    }
    
    public int Rear() {
        if(isEmpty()){
            return -1;
        }
        int index=(rear==0)?elem.length-1:rear-1;
        return elem[index];
    }
    
    public boolean isEmpty() {
        return rear==front;
    }
    
    public boolean isFull() {
        return (rear+1)%elem.length==front;
    }
}

Deque双端队列

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。
那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。

再看这张图:在这里插入图片描述
Deque是一个接口,所以使用时必须创建LinkedList的对象。

public static void main(String[] args){
    //普通队列
    Deque<Integer> queue1=new LinkedList<>();
    //双端队列
    Queue<Integer> queue2=new LinkedList<>();
    //数组顺序的双端队列
    Queue<Integer> queue3=new ArrayDeque<>();

完结

好了,到这里Java语法部分就已经结束了~
如果这个系列博客对你有帮助的话,可以点一个免费的赞并收藏起来哟~
可以点点关注,避免找不到我~ ,我的主页:optimistic_chen
我们下期不见不散~~Java

下期预告: 【Java数据结构】- - -二叉树

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

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

相关文章

fme处理空间数据入门v0

概述 本教程是最最最基本的fme处理空间数据内容&#xff0c;给新同事介绍我以前是怎么干活用的&#xff0c;基本啥有用的东西。 本教程主要说如何在 FME Workbench中创建模板文件&#xff08;一般我们把fme写的工作空间就叫模板&#xff09;&#xff0c;教程里面主要是利用GI…

Linux2.6内核进程调度队列详细讲解

上图是 Linux2.6 内核中进程队列的数据结构&#xff0c;之间关系也已经给大家画出来&#xff0c;方便大家理解。 一个 CPU 拥有一个 runqueue。 Linux真正的调度方式是通过runqueue进行调度的&#xff0c;我们知道进程的优先级范围是根据nice值确定的&#xff0c;而nice值的范围…

怎么配置Datagrip中字体的大小,修改注释的颜色呢

新手刚安装Datagrip时&#xff0c;都会遇到怎么调字体大小的问题&#xff0c;接下来解决一下吧 具体步骤&#xff1a; 1.进入Datagrip的操作窗口后&#xff0c;点击左上方的菜单栏中file(文件)。 2.在文件中点击设置setting。 3.在设置窗口点击Editor,再点击Font。 4.在Fo…

.[[Hoeosi@airmail.cc]].rntc勒索病毒数据怎么处理|数据解密恢复

导言&#xff1a; 近年来&#xff0c;勒索病毒&#xff08;也称为勒索软件&#xff09;已成为网络安全领域的一大威胁。其中&#xff0c;.[[Hoeosiairmail.cc]].rntc勒索病毒作为一种新型恶意软件&#xff0c;通过加密用户的重要文件并要求支付赎金来解锁&#xff0c;给个人和…

深度学习 —— 个人学习笔记20(转置卷积、全卷积网络)

声明 本文章为个人学习使用&#xff0c;版面观感若有不适请谅解&#xff0c;文中知识仅代表个人观点&#xff0c;若出现错误&#xff0c;欢迎各位批评指正。 三十九、转置卷积 import torch from torch import nndef trans_conv(X, K):h, w K.shapeY torch.zeros((X.shape[…

Datawhale AI夏令营第四期魔搭- AIGC文生图方向 task02笔记

1 前言 本次是学习内容是Datawhale AI夏令营第四期-AIGC文生图方向的学习笔记。 2 AIGC简介 AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;即人工智能生成内容&#xff0c;即人工智能通过学习大量的数据&#xff0c;来实现自动生成各种内容&#xf…

仿RabbitMQ实现消息队列

前言&#xff1a;本项目是仿照RabbitMQ并基于SpringBoot Mybatis SQLite3实现的消息队列&#xff0c;该项目实现了MQ的核心功能&#xff1a;生产者、消费者、中间人、发布、订阅等。 源码链接&#xff1a;仿Rabbit MQ实现消息队列 目录 前言&#xff1a;本项目是仿照Rabbi…

JVM运行时数据区之虚拟机栈

【1】概述 Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff09;&#xff0c;早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈&#xff0c;其内部保存一个个的栈帧&#xff08;Stack Frame&#xff09;&#xff0c;对应着一次次的Java方法调用。 栈是运行…

World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG

World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG 魔兽世界怀旧版&#xff0c;80级&#xff0c;5人副本古达克&#xff0c;科技队伍&#xff08;BUG队伍&#xff09; 副本有两个门口 这样看&#xff0c;是不是觉得很怪。是的&#xff0c;和图1刚好相反的。 因此应该翻转180…

24电赛H题总结

一、题目 题目链接&#xff1a;自动行驶小车&#xff08;H题&#xff09; 我们截取一些重要信息 1. 小车行驶场地示意图 2.要求 二、赛题分析 技术挑战与准备 MCU熟悉度&#xff1a;尽管TI MSPM0系列MCU在使用上类似于STM32CUBEIDEKeil&#xff0c;但其开发环境也需要熟悉。因…

数据结构入门——04栈

1.栈 栈是限制在一端进行插入操作和删除操作的线性表&#xff08;俗称堆栈&#xff09; 允许进行操作的一端称为“栈顶”&#xff0c;另一固定端称为“栈底”&#xff0c;当栈中没有元素时称为“空栈”。 栈的特点 &#xff1a;后进先出LIFO&#xff08;Last In First Out&a…

支持I2C接口、抗干扰性强、14通道触摸按键的电容式触摸芯片-GTX314L

电容式触摸芯片 - GTX314L是具有多通道触发传感器的14位触摸传感器系列&#xff0c;它是通过持续模式提供中断功能和唤醒功能&#xff0c;广泛适用于各种控制面板应用&#xff0c;可直接兼容原机械式轻触按键的处理信号。 GTX314L芯片内部采用特殊的集成电路&#xff0c;具有高…

C++进阶-智能指针

1. 为什么需要智能指针&#xff1f; 下面我们先分析一下下面这段程序有没有什么内存方面的问题&#xff1f;提示一下&#xff1a;注意分析MergeSort函数中的问题。 int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");retur…

【C语言】内存管理

C语言-内存管理 一、C进程内存布局二、栈内存1、存储在栈内存中的参数有哪些&#xff1f;2、栈内存的特点&#xff1f; 三、静态数据四、数据段与代码段五、堆内存 一、C进程内存布局 \qquad 任何一个程序&#xff0c;正常运行都需要内存资源&#xff0c;用来存放诸如变量、常量…

第九届“创客中国”武汉区域赛正式启幕 灵途科技勇夺前三,晋级决赛!

8月8日&#xff0c;第九届“创客中国”武汉区域赛正式启幕&#xff0c;首场聚焦先进制造领域。灵途科技勇夺先进制造领域专场企业组前三名&#xff0c;成功晋级决赛。 “创客中国”大赛是工业和信息化部组织开展的双创赛事活动&#xff0c;以构建产业链协同发展为出发点&#…

Win10 VisualStudio 2022编译ollvm 13.x

VisualStudio配置 1&#xff0c;正常配置C桌面环境 2&#xff0c;在单个组件中选择用于Windows得C Cmake工具 下载OLLVM13.x https://github.com/heroims/obfuscator/tree/llvm-13.x 解压后进入文件夹&#xff0c;命令行输入 cmake -G “Visual Studio 17 2022” -DLLVM_EN…

Java面试--设计模式

设计模式 目录 设计模式1.单例模式&#xff1f;2.代理模式&#xff1f;3.策略模式&#xff1f;4.工厂模式&#xff1f; 1.单例模式&#xff1f; 单例模式是Java的一种设计思想&#xff0c;用此模式下&#xff0c;某个对象在jvm只允许有一个实例&#xff0c;防止这个对象多次引…

依赖倒置原则:构建灵活软件架构的基石 - 通过代码实例深入解析

1.引言 1.1为什么要学习依赖倒置原则 在软件开发过程中&#xff0c;我们经常需要对代码进行修改和扩展。如果代码之间的耦合度过高&#xff0c;那么在进行修改或扩展时&#xff0c;可能会对其他部分的代码产生影响&#xff0c;甚至引发错误。这就要求我们在编写代码时&#xf…

【VS Code】 vue项目使用scss显示语法错误、build编译正常

开发vue项目&#xff0c;使用scss老是报这个错误 解决方式&#xff1a; 1.安装vetur 2.在vs code的设置中添加 "files.associations": { "*.vue": "vue" }解决&#xff1a;

线性规划约束一个矩形在Polygon内部

最近在用线性规划&#xff0c;有一个比较有趣的问题&#xff0c;记录一下思路。 如何用线性规划约束一个矩形在Polygon内部&#xff1f; 问题&#xff1a;有如下图蓝色矩形&#xff0c;用线性规划表示出绿色矩形被约束在polygon内部&#xff0c;矩形的中心坐标是(x, y),宽和高…