数据结构:队列Queue详解

news2024/9/23 7:31:15

文章目录

    • 一、队列的概念和特点
    • 二、队列的使用
    • 三、队列的简单实现
    • 四、循环队列

一、队列的概念和特点

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

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头机制,建议将图片保存下来直接上传(img-ZGiWMZmY-1692425661523)(C:\Users\28779\AppData\Roaming\Typora\typora-user-images\image-20230705144953782.png)]

二、队列的使用

在 Java 中, Queue是个接口,底层是通过链表实现 的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OikCmRLE-1692425661524)(C:\Users\28779\AppData\Roaming\Typora\typora-user-images\image-20230819131252250.png)]

java中,常见的队列方法有以下几种:

方法功能
boolean offer(E e)入队列
E poll()出队列
peek()获取队头元素
int size()获取队列中有效元素个数
boolean isEmpty检测队列是否为空

注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。

public static void main(String[] args) {
	Queue<Integer> q = new LinkedList<>();
	q.offer(1);
	q.offer(2);
	q.offer(3);
	q.offer(4);
	q.offer(5); // 从队尾入队列
	System.out.println(q.size());
	System.out.println(q.peek()); // 获取队头元素
    
	q.poll();
	System.out.println(q.poll()); // 从队头出队列,并将删除的元素返回
	if(q.isEmpty()){
		System.out.println("队列空");
	}else{
		System.out.println(q.size());
	}
}

三、队列的简单实现

这里我们用链表的方式来模拟实现队列。

public class MyQueue {
    static class ListNode {
        public ListNode next;
        public int val;
        public ListNode(int val) {
            this.val = val;
        }
    }

    public ListNode head;
    public ListNode last;
    private int usedSize;
    
    //入队列
    public void offer(int val) {
        ListNode node = new ListNode(val);
        if(head == null) {
            head = node;
        } else {
            last.next = node;
        }
        last = node;
        usedSize ++;
    }
    
 	//出队列
    public int poll() {
        if(head == null) {
            return -1;
        } else if (head.next == null) {
            int temp = head.val;
            head = null;
            last = null;
            usedSize --;
            return temp;
        } else {
            int temp = head.val;
            head = head.next;
            usedSize --;
            return temp;
        }
    }
    
    //获取对头元素
    public int peek() {
        if(head == null) {
            return -1;
        }
        return head.val;
    }

    //获取队列长度
    public int getUsedSizeSize() {
        return usedSize;
    }

    //判断队列是否为空
    public boolean isEmpty() {
        if(head == null && last ==null) {
            return true;
        }
        return false;
    }
}

四、循环队列

622. 设计循环队列OJ练习题

实际中我们有时还会使用一种队列叫循环队列。环形队列通常使用数组实现。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fK0lsKZc-1692425661525)(C:\Users\28779\AppData\Roaming\Typora\typora-user-images\image-20230819131018435.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VjvyZuz9-1692425661525)(C:\Users\28779\AppData\Roaming\Typora\typora-user-images\image-20230819134718546.png)]

Q.front 指向的是队头,Q.rear指向的是可插入元素的位置。

如何区分空与满

队列满:(Q.rear + 1)% array.length == Q.front

队列空: Q.rear == Q.front

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

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

相关文章

使用Nginx调用网关,然后网关调用其他微服务

问题前提&#xff1a;目前我的项目是已经搭建了网关根据访问路径路由到微服务&#xff0c;然后现在我使用了Nginx将静态资源都放在了Nginx中&#xff0c;然后我后端定义了一个接口访问一个html页面&#xff0c;但是html页面要用到静态资源&#xff0c;这个静态资源在我的后端是…

windows服务器下java程序健康检测及假死崩溃后自动重启应用、开机自动启动

前两天由于项目需要&#xff0c;一个windows上的批处理任务&#xff08;kitchen.bat&#xff09;&#xff0c;需要接到mq的消息通知后执行&#xff0c;为了快速实现这里我们通过springboot写了一个jar程序&#xff0c;用于接收mq的消息&#xff0c;并调用bat文件。 本程序需要实…

【欧拉计划】偶数斐波那契数

题目链接&#xff1a;偶数斐波那契数 解法一&#xff1a;暴力枚举 看见题目&#xff0c;第一反应就是先找到小于400万的所有斐波那契数&#xff0c;再从这些斐波那契数中筛选出偶数进行求和。 由于递归方法求斐波那契数的时间复杂度较高&#xff0c;故这里采用迭代的方法。 先…

C++笔记之全局函数做友元与类做友元

C笔记之全局函数做友元与类做友元 code review! 文章目录 C笔记之全局函数做友元与类做友元1.全局函数做友元2.类作友元 1.全局函数做友元 代码 #include <iostream> using namespace std;class MyClass { private:int x; public:MyClass(int a) : x(a) {}friend void…

互斥锁概念使用

互斥锁的创建两种方式 1.动态方式 #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <string.h> FILE *fp; void *func2(void *arg) {pthread_detach(pthread_self());printf("this is func2 thread\n");char str2[]…

mybatis入门的环境搭建及快速完成CRUD(增删改查)

又是爱代码的一天 一、MyBatis的介绍 ( 1 ) 背景 MyBatis 的背景可以追溯到 2002 年&#xff0c;当时 Clinton Begin 开发了一个名为 iBATIS 的持久化框架。iBATIS 的目标是简化 JDBC 编程&#xff0c;提供一种更直观、易用的方式来处理数据库操作。 在传统的 JDBC 编程中&…

【大数据】Flink 详解(五):核心篇 Ⅳ

Flink 详解&#xff08;五&#xff09;&#xff1a;核心篇 Ⅳ 45、Flink 广播机制了解吗&#xff1f; 从图中可以理解 广播 就是一个公共的共享变量&#xff0c;广播变量存于 TaskManager 的内存中&#xff0c;所以广播变量不应该太大&#xff0c;将一个数据集广播后&#xff0…

代码随想录算法训练营day39 | 62. 不同路径,63. 不同路径 II

目录 62. 不同路径 63. 不同路径 II 62. 不同路径 类型&#xff1a;动态规划 难度&#xff1a;medium 思路&#xff1a; 应用二维数组的动态规划&#xff0c;到达某个方格的方法数目&#xff0c;为这个方格的上一个方格和左一个方格的方法数目和。 需要先初始化第一行和第一…

ubuntu安装Microsoft Edge并设置为中文

1、下载 edge.deb 版本并安装 sudo dpkg -i microsoft-edg.deb 2. 设置默认中文显示 如果是通过.deb方式安装的&#xff1a; 打开默认安装路径下的microsoft-edge-dev文件&#xff0c;在文件最开头加上: export LANGUAGEZH-CN.UTF-8 &#xff0c;保存退出。 cd /opt/micr…

【Redis】什么是缓存击穿,如何预防缓存击穿?

【Redis】什么是缓存击穿&#xff0c;如何预防缓存击穿&#xff1f; 缓存击穿是指一个 Key 非常热点&#xff0c;大并发集中对这一个点进行访问&#xff0c;当这个Key 在失效的瞬间&#xff0c;持续的大并发就会穿破缓存&#xff0c;直接请求数据库。缓存击穿和缓存雪崩的区别…

代码随想录-字符串01 344.反转字符串541. 反转字符串II替换空格翻转字符串里的单词左旋转字符串

题目目录 ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer 05.替换空格 ● 151.翻转字符串里的单词 ● 剑指Offer58-II.左旋转字符串 344.反转字符串 344.反转字符串 很经典的字符串考察点&#xff0c;考察对双指针的熟悉程度。 解法是通过双指针从字符串数组两边向中…

JavaScript函数式编程【进阶】

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…

Linux 安全技术和防火墙

目录 1 安全技术 2 防火墙 2.1 防火墙的分类 2.1.1 包过滤防火墙 2.1.2 应用层防火墙 3 Linux 防火墙的基本认识 3.1 iptables & netfilter 3.2 四表五链 4 iptables 4.2 数据包的常见控制类型 4.3 实际操作 4.3.1 加新的防火墙规则 4.3.2 查看规则表 4.3.…

7-7 验证“哥德巴赫猜想”

分数 20 全屏浏览题目 切换布局 作者 徐镜春 单位 浙江大学 数学领域著名的“哥德巴赫猜想”的大致意思是&#xff1a;任何一个大于2的偶数总能表示为两个素数之和。比如&#xff1a;24519&#xff0c;其中5和19都是素数。本实验的任务是设计一个程序&#xff0c;验证20亿以…

认识负载均衡||WEBSHELL

目录 一、负载均衡 1.nginx负载均衡算法 2.nginx反向代理-负载均衡 二、webshell 1.构造不含数字和字母的webshell 2.如何绕过 一、负载均衡 1.nginx负载均衡算法 &#xff08;1&#xff09;轮询&#xff08;默认&#xff09;每个请求按时间顺序逐一分配到不同的后端服务&…

听GPT 讲Prometheus源代码--rules

Prometheus的rules目录主要包含规则引擎和管理规则的文件: engine.go 该文件定义了规则引擎的接口和主要结构,包括Rule,Record,RuleGroup等。它提供了规则的加载、匹配、评估和结果记录的功能。 api.go 定义了用于管理和查询规则的RESTful API,包括获取、添加、删除规则等方法。…

类之间的比较

作者简介&#xff1a; zoro-1&#xff0c;目前大一&#xff0c;正在学习Java&#xff0c;数据结构等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 类之间的比较 固定需求式比较器 固定需求式 通过…

恶意软件分析与反制: 深入研究各类恶意软件,介绍分析技术以及如何构建有效的反恶意软件策略

第一章&#xff1a;引言 在数字化时代&#xff0c;恶意软件已经成为网络安全领域的一大威胁。从病毒、蠕虫到特洛伊木马&#xff0c;各类恶意软件不断进化&#xff0c;威胁着个人、组织 ja以国家的信息安全。本文将深入探讨恶意软件的分析与反制方法&#xff0c;帮助读者更好地…

SpringCloud新人入门手册

一、SpringBoot流程图 二、创建一个单pom项目改为父子pom项目 0、检查idea是否在父模块pom中生成子模块 <modules><module>eureka</module></modules> 1、子模块pom.xml添加 <dependencies><dependency><groupId>org.springframew…

Redis专题-秒杀

Redis专题-并发/秒杀 开局一张图&#xff0c;内容全靠“编”。 昨天晚上在群友里看到有人在讨论库存并发的问题&#xff0c;看到这里我就决定写一篇关于redis秒杀的文章。 1、理论部分 我们看看一般我们库存是怎么出问题的 其实redis提供了两种解决方案&#xff1a;加锁和原子操…