05. 数据结构之队列

news/2025/4/1 7:57:42/

前言

队列(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);@BeforeClasspublic static void init() {//入队三个元素arrayQueue.enQueue(1);arrayQueue.enQueue(2);arrayQueue.enQueue("我是队尾");}@Testpublic void testEnQueue() {arrayQueue.enQueue(1);arrayQueue.enQueue(2);}@Testpublic 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.ppmy.cn/news/74306.html

相关文章

VMware ESXi 6.0 多网卡接入 多网段绑定 虚机接入不同网段

网卡要与对应网段的网络联通。不同的网卡接入不同网段的网络。要为vmware esxi 6 的多个虚机配置不同网段的ip地址,首先选择主机对应的网口分别插上处于在不同网段的网线。 配置管理网络 多个网口接入,只可以配置一个管理网络,就是只有一个网…

干货 | 利用SPSS进行高级统计分析第一期

Hello,大家好! 这里是壹脑云科研圈,我是喵君姐姐~ 你是否还在为分析实验数据而感到头疼?你是否还在苦于自己不知道如何选择合适的模型来分析数据? 本期我们就来为大家带来了利用SPSS软件进行高级统计分析…

【华为OD机试真题2023B卷 JAVA】模拟消息队列

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 模拟消息队列 知识点排序 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 让我们来模拟一个消息队列的运作,有一个发布者和若干消费者,发布者会在给定的时刻向消息队列发送消息,若此时消息队列有消费者订阅,这…

为什么x86架构一个字节是8个bit

探究计算机存储的历史:为什么x86架构下一个字节是8个bit 原文链接:Some possible reasons for 8-bit bytes About author I’m a software developer. I live in Montreal. I sometimes give talks. Most of my income comes from my programming zines…

Cesium源码分享--气泡窗

Cesium气泡窗插件 在线api文档说明 在线体验地址 更多案例地址 免费gis数据 ps:如果可以的话,希望大家能给我个star,好让我有更新下去的动力; 实现原理: Cesium和我们平时常见的leaflet、ol以及arcgis api是不一样…

企业落地数字化转型,如何部署战略规划

当前环境下,各领域企业通过数字化相关的一切技术,以数据为基础、以用户为核心,创建一种新的,或对现有商业模式进行重塑就是数字化转型。这种数字化转型给企业带来的效果就像是一次重构,会对企业的业务流程、思维文化、…

Camtasia2023简体中文版屏幕录像 支持MP4/AVI/WMV等多种格式

在现在的网络互联网时代,越来越多的人走上了自媒体的道路。有些自媒体人会自己在网络上录制精彩视频,也有一些人会将精彩、热门的电影剪辑出来再加上自己给它的配音,做成大家喜欢看的电影剪辑片段。相信不管大家是自己平时有独特的爱好也好、…

ffmpeg rtsp解析

一、 rtsp 协议说明 rtsp的协议层级 rtsp 属于应用层, 使用tcp传输,主要是传递服务器的一些信息,实现流连接。播放 暂停 销毁等控制 rtp 实现音视频数据包的发送,通过RTSP等协议的SDP信息协商好了RTP数据包的发送目的和传输方式…