数据结构与算法-队列

裘宗燕-数据结构与算法python描述笔记(队列) 裘宗燕-数据结构与算法python描述笔记(队列):队列的实现以及迷宫问题的求解 阅读详情
  1. 队列

特性

 

操作特性:

队列也是一种操作受限的线性表,只允许在一端插入和删除数据。

跟栈一样,队列也可以使用数据来实现,还可以使用链表来实现。

使用数组实现的队列叫做顺序队列,使用链表实现的队列叫做链式队列。

 

 

顺序队列

 

/**
 * use array implement queue
 *
 * @author liujun
 * @version 0.0.1
 * @date 2019/08/23
 */

public class MyArrayQueue {

 
private int[] array;

 
/** max queue size */
 
private final int MaxArraySize;

  private int
size;

  private int
head;

  private int
tail;

  public
MyArrayQueueOne(int maxArraySize) {
   
this.MaxArraySize = maxArraySize;
    this
.array = new int[maxArraySize];
    this
.head = 0;
    this
.tail = 0;
 
}

 
public void enqueue(int value) {
   
if (tail < MaxArraySize) {
     
array[tail] = value;
     
tail++;
     
size++;
   
} else {
     
throw new IndexOutOfBoundsException("queue full");
   
}
  }

 
public int size() {
   
return size;
 
}

 
public boolean isfull() {
   
return size == MaxArraySize;
 
}

 
public int dequeue() {

   
int getValue = -1;

    if
(head < tail) {
      getValue =
array[head];

      for
(int i = 1; i < tail; i++) {
       
array[i - 1] = array[i];
     
}
     
tail = tail - 1;
     
size--;
   
}

   
return getValue;
 
}
}

 

 

 

 

这是一个基本的队列实现,但存在着问题,那就是数组空间连续性的问题,在每次操作的,会进行数据的所有数据的一次搬移操作。

 

 

每次有一个数据从队列中取出,就会触发一次数据的搬移,浪费严重。针对此问题,可采用集中式的触发。即当队列中的数据被填满了,才触发一次数据搬移操作。在队列还没有被填满之前,不进行数据的搬移操作。

 

public void enqueue(int value) {
 
if (tail <= MaxArraySize) {

   
//如果空间已经被占用,则触发一次搬移操作
   
if (tail == MaxArraySize) {
     
for (int i = head; i < tail; i++) {
       
array[i - head] = array[i];
     
}
     
tail = head;
     
head = 0;
   
}
   
//
   
if (tail < MaxArraySize) {
     
array[tail] = value;
     
tail++;
     
size++;
   
}
  }
else {
   
throw new IndexOutOfBoundsException("queue full");
 
}
}

 

 

 

循环队列

在顺序队列的实现中,当tail == MaxArraySize 会有数据的搬移操作。必然的会影响到性能,那有没有不搬移数据的实现呢?那这个来看看循环队列的实现思路。

 

循环队列,类比循环链表, 那就是一个首尾相连的数组。

就像一个环一样,队列的添加与删除总不断的这环中往复。

 

但要想写出没有bug的环境形队列,关键在于确定队空与队满的判定条件。假如队列大小为n,那么,队空的判定条件就是head==tail,那队满的判断条件呢。先来看看图中所画队满时的环形队列

 

tail =1、head=2 队列大小为8,可(1+1)%8=2

总结规律就是(tail+1)%n == head,这就是环形队列满的判定条件。

 

再来看看代码实现吧:

 


/**
 * use array implement cycle queue
 *
 * @author liujun
 * @version 0.0.1
 * @date 2019/08/25
 */

public class MyCycleQueue {

 
private final int[] array;

  private final int
capacity;

  private int
head;

  private int
tail;

  public
MyCycleQueue(int maxSize) {
   
this.capacity = maxSize;
    this
.array = new int[capacity];
 
}

 
public void enqueue(int value) {
   
// check cycle is full
   
if ((tail + 1) % capacity == head) {
     
throw new IndexOutOfBoundsException("queue is full");
   
} else {
     
array[tail] = value;
     
tail = (tail + 1) % capacity;
   
}
  }

 
public int dequeue() {
   
// check cycle is null
   
int getvalue = -1;
    if
(head == tail) {
     
throw new NegativeArraySizeException("queue is empty");
   
} else {
      getvalue =
array[head];
     
head = (head + 1) % capacity;
   
}

   
return getvalue;
 
}
}

 

 

 

 

链式队列

链式队列的实现.

因为链表只涉及节点的删除与添加操作。没有数据搬移的操作,实现起来也比较简单。但因为链表是内存不连续,对于CPU的缓存不友好。

 

 

/**
 * use linked implement queue
 *
 * @author liujun
 * @version 0.0.1
 * @date 2019/08/23
 */

public class MyLinkedQueue {

 
class LinkNode {
   
private int val;

    private
LinkNode next;

    public
LinkNode(int valu) {
     
this.val = valu;
   
}
  }

 
/** max queue size */
 
private final int MaxQueueSize;

  private
LinkNode root = new LinkNode(-1);

  private
LinkNode tail = root;

  private int
size;

  public
MyLinkedQueue(int maxQueueSize) {
   
this.MaxQueueSize = maxQueueSize;
 
}

 
public int size() {
   
return size;
 
}

 
public boolean isfull() {
   
return size == MaxQueueSize;
 
}

 
public void enqueue(int value) {

   
if (size < MaxQueueSize) {
      LinkNode tmpValue =
new LinkNode(value);

     
tail.next = tmpValue;
     
tail = tmpValue;

     
size++;
   
}
  }

 
public int dequeue() {

   
int getvalue = -1;
    if
(size > 0) {
      LinkNode linkNode =
root.next;
     
getvalue = linkNode.val;

     
root.next = linkNode.next;

      if
(null == root.next) {
       
tail = root;
     
}

     
size--;
   
}

   
return getvalue;
 
}
}

 

 

并发队列

这是一种特殊性质的队列,即在一个队列的实现中,加入了阻塞操作。当队列为空,队头取数据就会被阻塞,当队列满了,队尾放数据就会被阻塞,这很好的协调了两端速度不一至的问题,这个在实际的软件开发过程中非常的常用,就是我们平时开发中所说的,“生产者-消费者模型”,

 

 

当生产者线程的速度过快,消费者线程来不及消费时,队列很快被填满,生产者线程就会被阻塞。待消费者线程将队列数据取走,再唤醒生产者线程继续生产。

 

还可以协调生产者与消费者的个数,来提高数据的处理速度。

 

 

并发队列即可以使用链表来实现,还可以使用数组来实现。

使用链表来实现的阻塞队列,可以支持一个无界的队列,可以用来处理很长的任务队列,但由于队列可能会非常的长,处理时间也可能会非常的长,所以针对时间不敏感的任务,就比较适合使用链表来实现的阻塞队列,比如定时调度的任务,后台消息发送队列等。

使用数组来实现的阻塞队列,只支持一个有限的数组的大小,当处理的任务超过队列时,可直接拒绝任务处理,这样就更加适合时间敏感的系统,比如秒杀,处理用户的请求等。但队列的大小,设置时也需要格外的注意, 队列太大,导致处理请求过多的等待,过小,又导致资源浪费。

Java数据结构与算法之Queue队列 目录: 1.队列概述 2.队列分类 3.数组实现自定义队列 4.链表实现自定义队列 1.队列概述 队列是一种特殊的线性表,它可以通过数组与链表两种方式实现,它与单链表和数组的区别是它只能从队尾添加元素, 队首删除元素,同时满足先进先出(IFIO)的原则。 2.队列分类 3.数组实现自定义队列 (1)自定义队列接口CustomQueue.java package 阅读详情

相关推荐

银河麒麟V10 SP3系统下如何安全安装gcc-toolset-10(附yum仓库避坑指南)

本文详细介绍了在银河麒麟V10 SP3系统中安全部署gcc-toolset-10的完整方案。核心在于通过配置默认禁用的yum仓库(如EPKL仓库)并配合--enablerepo参数进行精准安装,有效规避依赖冲突风险,实现与系统默认GCC 7.3的稳定共存。文章还提供了多版本环境切换、系统维护及故障排查的实用指南,确保操作的可控与可逆。

h0i1j2k3l的博客 588

构造一个空队列的c语言语句,数据结构(C语言版)-第3章 栈和队列

3.1 栈和队列的定义和特点3.2 案例引入3.3 栈的表示和操作的实现3.4 栈与递归3.5 队列的的表示和操作的实现3.6 案例分析与实现 基本操作有入栈、出栈、读栈顶元素值、建栈、判断栈满、栈空等队列是一种先进先出(FIFO) 的线性表. 在表一端插入,在另一端删除 顺序栈的表示 顺序栈的定义:#define MAXSIZE 100typedefstruct{SElemTyp...

weixin_39796868的博客 1822

IEC 62061 总结与适用范围

IEC 62061 是国际电工委员会(IEC)制定的。

cactusDaYe的博客 1081

队列

队列跟栈一样,也是一种操作受限的线性表数据结构。它具有先进先出的特性,最基本的操作也是两个:入队 enqueue(),在队尾插入元素;出队 dequeue(),在队头删除元素。 顺序队列和链式队列 1、手写基于数组的实现方法:数组中的数据不连续问题如何解决。 // 用数组实现的队列 public class ArrayQueue { // 数组:items,数组大小:n pr...

u014694510的博客 260

交通流预测爬坑记(一):交通流数据集,原始数据

常用的交通流数据集,持续更新~~

K_first的博客 4万+

从 Non-Unicode 到 Unicode:ABAP 程序切换的坑、原理与工程化落地指南

摘要 老SAP系统中ABAP程序员常假设1字符=1字节,导致大量代码依赖单字节处理逻辑。Unicode系统的引入彻底改变了字符长度、偏移量等底层认知,强制要求程序遵循Unicode规则。关键问题包括:字符/字节语义混淆、结构体访问风险、以及ABAP语言版本的门槛限制。迁移时需要重点关注字符串处理、二进制协议解析等场景,利用UCCHECK、RSUNISCAN_FINAL等工具扫描风险,并通过持续集成机制确保代码质量。建议在Non-Unicode阶段就启用unicode_check参数模拟严格模式,分批次修复问

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3449

Java数据结构与算法———(3)用数组模拟一个队列

用数组模拟一个队列,缺点是不能重复使用 一、代码: import java.util.Scanner; public class ArrayQueueDemo { public static void main(String[] args) { // 创建一个队列 ArrayQueue queue = new ArrayQueue(3);// 创建一个包含三个数据的队列 char key = ' ';// 接收用户输入,此时key的值是空格 Scanner scanner = new

GTboy100的博客 288

【Bug已解决】Claude Desktop Cowork 报错 Workspace unavailable 解决方案

方案适用场景推荐指数确认虚拟机镜像下载完整性排查的第一步,最基础的前提检查⭐⭐⭐⭐⭐确认虚拟机平台功能已启用Windows 系统功能层面的必要条件⭐⭐⭐⭐⭐重启 CoworkVMService快速尝试恢复服务正常状态⭐⭐⭐⭐完全重启客户端排除临时性状态错乱⭐⭐⭐⭐降级使用文件工具临时替代方案,不阻塞当前工作⭐⭐⭐报错的本质是Cowork 功能依赖的虚拟机管理服务,在 Windows 应用包隔离机制下未能正确定位虚拟机文件的实际存放路径。

博客 6223

数据结构与算法——栈和队列

栈和队列是两种重要的线性结构,本篇文章详细总结了数据结构与算法中栈和队列的终点知识,并且结合代码片段实现其基本操作,干货满满,每一句话都是重点,希望能给更多的小伙伴在学习数据结构与算法时带来一定帮助...

小田是个程序员的博客欢迎你的到来呀~ 2万+

最新Anaconda3的安装配置及使用教程(详细过程)

最新Anaconda3安装使用Anaconda下载方式一:官网下载方式二:清华镜像下载(推荐)Anaconda安装 Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项 Anaconda + Jupyter 基本上已经是大部分机器学习/数据分析等开发者标配的开发环境, 不多介绍,直接进去正题: Anaconda下载 方式一:官网下载 下载地址传送门: 官网首页:https://www.anaconda.com/ 官网下载页:https://www

HowieXue 薛永浩的博客 34万+

把个人化的 SQVI 报表变成可维护、可共享、可传输的 ABAP Query:从定位来源到转换落地的完整路线图

本文针对SAP系统中业务用户常用但难以维护的SQVI临时报表问题,提供了一套完整的解决方案。文章首先区分了SQVI(个人临时报表)和ABAP Query(团队可维护报表)的关键差异,重点介绍了如何通过函数模块RSAQ_DECODE_REPORT_NAME反查报表来源。对于SQVI报表,详细说明了定位创建人和转换为团队可维护的ABAP Query的具体步骤,包括Query Area切换、转换操作和后续维护方法。最后总结了常见问题的解决方案,如字段调整、口径固化和生成程序名反查等,为现场实施提供了可直接操作的完

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 302

《数据结构》--队列【各种实现,算法推荐】

队列是一种常见的数据结构,按照先进先出(FIFO,First In First Out)的原则排列数据。也就是说,最早进入队列的元素最先被移除。:将元素添加到队列的尾部。:从队列的头部移除并返回元素。:初始化一个空队列。:返回但不移除队列的头部元素(通常称为“peek”或“front”)。:检查队列中是否还有元素。:返回队列中元素的数量。

Stark的博客 2877

PNETLab 镜像包官方下载太慢?不急,最新版本PNET_4.2.10分享!

你好,这里是网络技术联盟站,我是瑞哥。PNETLab是一个强大的网络仿真工具平台,全称Packet Network Emulator Tool Lab。它不仅允许用户进行深入的网络实验,还支持社区成员之间的实验室共享。PNETLab致力于为学习者、教师以及网络工程师提供一个全面的实验环境,以便于他们能够在实际部署前测试和验证网络配置和协议。和。这两个部分相辅相成,共同构成了一个全面且灵活的网络仿真生态系统。

网络技术联盟站 4467

数据结构与算法之队列

#数据结构与算法之队列

amenga123的博客 368

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

数据结构与算法——队列

1、队列的最大特点为先进先出,其主要的两个操作是入队和出队。2、队列即可以用数组实现,也可以用链表实现。用数组实现的叫顺序队列,用链表实现的叫链式队列。在数组实现队列的时候,会有数据搬移操作,要想解决数据搬移的问题,我们就需要像环一样的循环队列。3、循环队列,它长得像一个环。当数组实现队列时,将首尾相连,连接成一个环,形成环型的循环队列。实现循环队列代码的关键在于确定好队空和队满的判定条件。4、对于大部分资源有限的场景,当没有空闲资源时,基本上都可以通过“队列”这种数据结构来实现请求排队。

技术知识分享 508

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

队列 数据结构与算法 python版

队列是一种有次序的数据集合,其特征是:新数据项的添加总发生在一端(通常称为“尾 rear”端)而现存数据项的移除总发生在另一端(通常称为 “首front”端)当数据项加入队列,首先出现在队尾,随 着队首数据项的移除,它逐渐接近队首。这种次序安排的原则称为(FIFO:First-in first-out)先进先出 或“先到先服务first-come first-served”

jaycyj的博客 1901

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数据结构与算法 - 队列

数据结构

aiains的博客 4148

fifo算法模拟_JavaScript数据结构与算法队列与双端队列

开始之前本次分享是JavaScript数据结构与算法这一系列的第二篇文章。上篇分享的栈与本次的队列非常类似,但是使用了与后进先出不同的原则。本次分享同样介绍了双端队列的工作原理。双端队列是一种将栈的原则和队列的原则合在一起的数据结构。本次分享主要内容:队列数据结构双端队列数据结构用击鼓传花游戏模拟循环队列用双端队列检查一个词组是否构成回文队列简介队列是遵循先进先出(FIFO)原则的一组有...

weixin_39676348的博客 182

C++数据结构与算法——栈与队列

C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用来学习,刷题使用力扣网站,不定时更新,欢迎关注!

weixin_63866037的博客 1932

数据结构与算法(四):队列

数据结构与算法(一):数组 数据结构与算法(二):稀疏数组 数据结构与算法(三):浅识冒泡、选择、插入排序算法 队列的介绍 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 队列是一个有序列表,可以用数组或是链表来表现 遵循先入先出的原则,即:先存入队列的数据,要先取出,后存入的要后取出 使用数组模拟队列

派大星的博客 411

【数据结构】栈和队列 + 经典算法题

本文完整实现了栈和队列的数据结构,以及栈和队列的一些经典算法题,让我们更加清楚了解这两种数据结构特点,并熟悉运用。

x_p96484685433的博客 2101

数据结构与算法——栈与队列

讲解数据结构与算法——栈与队列

caicaptain 457

新星计划Day4【数据结构与算法】 稀疏数组与队列

新星计划Day4【数据结构与算法】 稀疏数组与队列 👩‍💻博客主页:京与旧铺的博客主页 ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csdn首发! 😘系列专栏:java学习 💻首发时间:🎞2022年4月28日🎠 🎨你做三四月的事,八九月就会有答案,一起加油吧 🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦 🎧最后的话,作者是一个新人,在很多方面还做的不好,欢迎大佬指正,一起学习哦,冲冲冲 🛒导航小助手🎪 文章目录新星计划Day4【数据结构与算法】 稀疏数组与队列在这里插入图片描述🛒导

qq_46272491的博客 2293

C语言数据结构与算法--简单实现队列的入队和出队

队列中 允许插入的一端叫队尾(rear),允许删除的一端称队头(front)。用链表来表示的队列,简称链队列。实际 上链队列的操作为单链表的插入和删除操作的特 殊情况。队列的顺序表示用一组地址连续的存储单元依次存放从队头(front)到队尾 (rear)的元素。至于队列的链式表示和环形表示大家可以自己做做,环形表示思路也在上面,链式表示大家可以仿照我之前写的线性表的链式表示和栈的链式表示。否则,队尾指针加 1, 并在队尾插入新的元素。队列的表示形式有两种:队列的链式表示、队列的顺序表示。

2403_83182682的博客 3002

大厂AI必备数据结构与算法——队列实现(六)详细文档

计算机科学中,queue 是以顺序的方式维护的一组数据集合,在一端添加数据,从另一端移除数据。习惯来说,添加的一端称为尾,移除的一端称为头,就如同生活中的排队买商品queue先定义一个简化的队列接口/*** 向队列尾插入值* @param value 待插入值* @return 插入成功返回 true, 插入失败返回 false*//*** 从对列头获取值, 并移除* @return 如果队列非空返回对头值, 否则返回 null*/E poll();/**

程序员-杨胡广的博客 1518
上一篇: 栈
下一篇: 数据结构与算法-队列之leetcode练习(641,239,622)
null_null_bug
博客等级 码龄7年 72粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值