05. 数据结构之队列

news2024/11/23 12:04:21

前言

队列(queue)是一种线性数据结构,队列中的元素只能先入先出(First In First Out,简称 FIFO)。队列和实际生活中的排队相对应,是一种和生活息息相关的数据结构,在很多系统中都会有队列设计思想的体现

1.概念

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

2. 存储原理

队列这种数据结构既可以用数组来实现,也可以用链表来实现

2.1 数组实现

用数组实现的队列叫作顺序队列
在这里插入图片描述

2.2 链表实现

用链表实现的队列叫作链式队列
在这里插入图片描述

3. 操作

3.1 数组实现

3.1.1 定义队列类

public class ArrayQueue {

    //私有化数组,禁止外部直接访问,限制对数组的操作只能通过,提供的入队,出对操作实现
    private Object[] nums; // 数组

    // head表示队头下标,tail表示队尾下标
    int head = 0;
    int tail = 0;

    // 申请一个大小为capacity的数组
    public ArrayQueue(int size) {
        nums = new Object[size];
    }
}      

3.1.2 入队

/**
 * @Description: 入队操作
 * @Author: wanlong
 * @Date: 2023/5/22 19:45
 * @param element:
 * @return boolean
 **/
public boolean enQueue(Object element){
    if (tail==nums.length){
        //队列满了,这里直接报错,后期可以优化扩容数组,保存更多元素
        return false;
    }
    nums[tail]=element;
    tail++;
    return true;
}

3.1.3 出队

/**
 * @Description:出队操作
 * @Author: wanlong
 * @Date: 2023/5/22 19:52
 * @return java.lang.Object
 **/
public Object deQueue(){
    if (head==tail){
        return null;
    }
    Object element = nums[head];
    head++;
    return element;
}

3.1.4 测试类

package org.wanlong.queue;

import org.junit.BeforeClass;
import org.junit.Test;

/**
 * @author wanlong
 * @version 1.0
 * @description: 测试队列
 * @date 2023/5/22 19:55
 */
public class Client {


    static ArrayQueue arrayQueue = new ArrayQueue(10);

    @BeforeClass
    public static void init() {
        //入队三个元素
        arrayQueue.enQueue(1);
        arrayQueue.enQueue(2);
        arrayQueue.enQueue("我是队尾");

    }

    @Test
    public void testEnQueue() {
        arrayQueue.enQueue(1);
        arrayQueue.enQueue(2);
    }

    @Test
    public void testDequeue() {

        Object o = arrayQueue.deQueue();
        System.out.println("第一个出队元素为:" + o);
        Object o2 = arrayQueue.deQueue();
        System.out.println("第二个出队元素为" + o2);

    }
}

3.1.5 运行结果

第一个出队元素为:1
第二个出队元素为2

3.2 链表实现

3.2.1 定义节点

package org.wanlong.queue;

/**
 * @author wanlong
 * @version 1.0
 * @description: 定义链表节点
 * @date 2023/5/22 20:05
 */
public class Node {

    Object value;
    Node next;

    public Node(Object value) {
        this.value = value;
    }
}

3.2.2 定义链表实现队列类

package org.wanlong.queue;

/**
 * @author wanlong
 * @version 1.0
 * @description:
 * @date 2023/5/22 20:05
 */
public class LinkedQueue {

    Node head;
    Node tail;
    int size;

    /**
     * @param element:
     * @return void
     * @Description:入队操作
     * @Author: wanlong
     * @Date: 2023/5/22 20:08
     **/
    public void enQueue(Node element) {
        if (tail == null) {
            head = element;
            tail = element;
        } else {
            tail.next = element;
            //指针后移
            tail = element;
        }
        //元素个数加一
        size++;
    }

    /**
     * @return java.lang.Object
     * @Description:出队操作
     * @Author: wanlong
     * @Date: 2023/5/22 20:08
     **/
    public Object deQueue() {

        if (head == null) {
            return null;
        }
        Node h = head;
        //将拉取的节点的下一个节点变成新的表头
        head = head.next;
        //把旧的表头的下一个节点指向设置为null,让gc回收
        h.next = null;

        if (head == null)
            tail = null;

        //元素个数减一
        size--;
        return h.value;
    }
}

3.2.3 定义测试类

@Test
public void testLinkedListEnqueue(){
    LinkedQueue linkedQueue = new LinkedQueue();
    linkedQueue.enQueue(new Node("我"));
    linkedQueue.enQueue(new Node("是"));
    linkedQueue.enQueue(new Node("呆"));
    linkedQueue.enQueue(new Node("子"));

    Object o1 = linkedQueue.deQueue();
    System.out.println("第一个出队元素:"+o1);
    Object o2 = linkedQueue.deQueue();
    System.out.println("第二个出队元素:"+o2);
}

3.2.4 运行结果

第一个出队元素:我
第二个出队元素:是

4. 时间复杂度

入队和出队都是O(1)

5. 应用

  1. 资源池
  2. 消息队列
  3. 命令队列

以上,本人菜鸟一枚,如有错误,请不吝指正

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

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

相关文章

MATLAB 之 其他形式的二维图形

文章目录 一、对函数自适应采样的绘图函数二、其他坐标系下的二维曲线图1. 对数坐标函数2. 极坐标图 三、其他特殊二维图像1. 条形类图形2. 面积类图形3. 散点类图形4. 矢量类图形 二维图线除采用直角坐标系外,还可采用对数坐标或极坐标。除了绘制二维曲线外&#x…

大环境不好难找工作?三面阿里,幸好做足了准备,已拿offer

大环境不好难找工作?三面阿里,幸好做足了准备,已拿offer 三面大概九十分钟,问的东西很全面,需要做充足准备,就是除了概念以外问的有点懵逼了(呜呜呜)。回来之后把这些题目做了一个分…

软件测试学习规划(学习思路、学习方法、面试技巧、后期发展、职业规划等)

软件测试学习思路 1、基础知识、理论知识(用例编写,测试方法,用例管理),测试思维的学习,很多人不屑理论,一股劲的扎进测试工具里面。最大的误区,工具永远学不完,测试必须…

【Node.js搭建服务器】使用Nodejs搭建简单的HTTP服务器----公网远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

C++入门--auto关键字、内联函数学习

目录 1.auto关键字(C11)1.1auto简介1.2auto的使用细则1.3auto函数不能推导的场景1.auto不能作为函数的参数2.auto不能直接用来声明数组 2.基于范围的for循环(C)2.1范围for循环的语法2.2使用auto的for循环2.3基于for循环的使用条件…

【linux网络】firewalld 防火墙

firewalld防火墙 一、firewalld防火墙1.1firewalld防火墙概述1.2firewalld与iptables的区别1.3Firewalld网络区域1.4firewalld数据处理的流程1.5firewalld防火墙的配置方法 二、firewall-cmd的命令选项2.1默认区域2.2网卡接口增删改查区域2.3源地址增删改查区域2.4区域规则的增…

接口测试之测试原则、测试用例、测试流程......

之前都是在网上杂乱得看了很多接口测试的资料,但总感觉不够系统,特地找了本书重新系统的学习一下,结合之前收集的一些资料查漏补缺。 《接口自动化测试持续集成postman》,这本大部分内容还是讲的是 postman 工具的使用方法&#…

spark应用程序的执行

1 SparkContext -》{ sparkconf --配置对象,基础配置 sparkEnv --环境对象,通讯环境 SchedulerBackend --通讯后台 住哟啊用于和Executor之间进行通讯 TaskScheduler – 任务调度器 任务调度 DAGScheduler – 阶段调度器 阶段划分 } spark.sparkContext…

贪心算法专练

⭐️前言⭐️ 本篇文章主要分享几道贪心算法的题目,贪心算法是一种基于自然智慧的算法,这类题目并没有统一的解法,但通常都是每一步做出一个局部最优的选择,最终的结果就是全局最优。 🍉欢迎点赞 👍 收藏 …

图神经网络:(化学领域)再次认识图神经网络

文章说明: 1)参考资料:PYG官方文档。超链。 2)博主水平不高,如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook和有关文献。超链。提取码8848。 文章目录 Mutagenicity数据集搭建模型训练模型文献阅读重新回来 Mutagen…

day36_JQuery

今日内容 零、 复习昨日 一、正则表达式 二、JQuery 零、 复习昨日 零、正则表达式 Regular expression RegExp 0.1 正则表达式 正则表达式是描述字符模式的对象。正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。语法: va…

京东云技术团队 —— 浅谈测试用例设计

一、测试用例为什么存在 1.1 定义 测试用例(Test Case)是指对特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。测试用例内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,最终形成文档类的输出。简而言之&am…

04. 数据结构之栈

前言 栈(stack)是一种线性数据的逻辑存储结构。栈中的元素只能先入后出(First In Last Out,简称FILO)。最早进入的元素存放的位置叫作栈底(bottom),最后进入的元素存放的位置叫作栈…

网络故障老搞不定,就看这篇笔记

大家好,我是老杨。 做咱们这行,每天遇到的故障千奇百怪什么都有。很多网工每天只是在工作而已,遇到一个问题,就解决一个问题,每天的日子都是一样的,枯燥无趣。 但是,就很少有人去汇总问题&…

分布式事务的21种武器 - 1

在分布式系统中,事务的处理分布在不同组件、服务中,因此分布式事务的ACID保障面临着一些特殊难点。本系列文章介绍了21种分布式事务设计模式,并分析其实现原理和优缺点,在面对具体分布式事务问题时,可以选择合适的模式…

Scala学习(五)---面向对象

文章目录 1.Scala面向对象的构造器1.1 主构造器和从构造器(辅助构造器)1.2 主构造器参数 2.继承2.1 抽象属性和方法2.2 匿名子类 1.Scala面向对象的构造器 1.1 主构造器和从构造器(辅助构造器) //主构造器 class ConstructorTest(name:String) {//主构造器调用val name1:Stri…

【MyBatis框架】

文章目录 Mybatis1.简介1.1MyBatis历史1.2MyBatis特性1.3MyBatis下载1.4和其它持久化层技术对比 2.搭建MyBatis2.1创建maven工程2.2创建MyBatis的核心配置文件2.3创建mapper接口2.4创建实体类2.5创建MyBatis的映射文件2.6通过junit测试功能2.7加入log4j日志功能2.8MyBatis的增删…

pytorch的学习与总结(第二次组会)

pytorch的学习与总结 一、pytorch的基础学习1.1 dataset与dataloader1.2 可视化工具(tensorboard)、数据转换工具(transforms)1.3 卷积、池化、线性层、激活函数1.4 损失函数、反向传播、优化器1.5 模型的保存、加载、修改 二、 pytorch分类项目实现2.1 网络模型2.2 具体代码 一…

新星计划2023【《计算之魂》读书会】学习方向报名入口!

前排提醒:这里是新星计划2023【《计算之魂》读书会】学习方向的报名入口,一经报名,不可更换。 ↓↓↓报名方式:(下滑到本页面底部) 一、关于本学习方向导师 博客昵称:异步社区博客主页&#x…

AI大模型时代,云从科技携“从容大模型”入场如何“从容”?

5月18日,在“AI赋能数字中国产业论坛暨2023云从科技人机协同发布会”上,云从科技自研“从容大模型”正式亮相。 根据发布会信息,“从容大模型”具备问答、阅读理解、文学创作以及解题方面的能力。受发布会消息影响,5月18日午间休盘…