《数据结构》队列

news2024/9/22 19:32:02

学习目录

  • 队列
      • 队列的概念
      • 队列的使用(Queue)
      • 队列的模拟实现
      • 循环队列
      • 双端队列(Deque)
      • 面试题

队列

队列的概念

队列是一种先进先出,后进后出的特点,是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表
进行删除操作的一端为队头,另一端插入操作的为队尾

在这里插入图片描述
队列术语:

  • 在末尾进行插入元素,叫做队尾
  • 在删除元素时,只能从第一个元素开始删除,而第一个元素的位置称为队头
  • 在向队列插入元素时称为入队(进队),新元素进队后就成为新的队尾元素
  • 在队列删除元素时称为出队(离队),元素出队后,后一个元素就成为队首元素

队列的使用(Queue)

队列的使用是通过 Queue 来实现, Queue是个接口,底层是通过链表实现的

Queue包含的方法有:

方法名称功能描述
add(E)入队列
boolean offer(E e)入队列(offer在容量受限制的情况下,不会抛异常)
E remove()出队列,并返回队头元素,出队失败引发异常
E poll()出队列,并返回队头元素
E element()获取队头元素,获取失败引发异常
peek()获取队头元素
intsize()获取队列中有效元素个数
boolean isEmpty()检测队列是否为空
  • add方法与offer方法的区别:
    两者都是在队列队头或队尾插入元素,前者(add)插入元素失败会引发异常,后者(offer)插入元素失败不会引发异常,只会以返回false的形式表示插入元素失败

  • remove方法与poll方法的区别:
    remove方法与poll方法都是在队头或队尾删除并返回元素,前者(remove)删除元素失败会引发异常,后者(poll)删除元素失败不会引发异常,只会以返回null的形式表示删除元素失败

  • element方法与peek方法的区别:
    两者都是在队列队头或队尾获取并返回元素,前者(get)获取元素失败会引发异常,后者(peek)获取元素失败不会引发异常,只会以返回null的形式表示获取元素失败

  • 总结:
    在有容量限制的情况下,使用 add(入队列)、remove(出队列)、element()(获取队头元素) 方法失败会引发异常
    而使用 offer(入队列)、poll(出队列)、peek获取队头元素) 方法不会

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

public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        queue.offer(1);// 入列
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
        
        System.out.println(queue.poll());//出队列
        System.out.println(queue.peek());//获取队列的第一个元素
        System.out.println(queue.isEmpty());//判断队列是否为空
    }

队列的模拟实现

队列可以用链式队列或者顺序队列来实现,但是队列使用链式队列实现更好
Java中队列是用双链表来实现的

例如:
使用双向链表来实现队列
在这里插入图片描述
使用双向链表来实现队列的具体过程和模拟实现LinkedLisd是一样的
不过是添加了入队和出队的方法

使用单链表来实现队列
在这里插入图片描述
代码示例:

public class MyQueue {

    static class ListNode{//定义节点
        public int val;//存放数值
        public ListNode next;//存放地址
        //初始化  构造方法
        public ListNode(int val) {
            this.val = val;
        }
    }
    public ListNode head;//头节点
    public ListNode tail;//尾节点
    public int usedSize;//记录节点个数
    
    // 入队
    public void offer(int val){
        ListNode node = new ListNode(val);
        if(head == null){
            head = node;
            tail = node;
        }else{
            tail.next = node;
            tail = tail.next;
        }
        usedSize++;
    }
    
    //出队
    public int poll(){
        if(head == null){
            return -1;
        }
        int ret = head.val;
        head = head.next;
        if(head == null){//如果是只有一个节点的情况下
            tail = null;//尾节点也要置空
        }
        usedSize--;//节点个数减1
        return ret;
    }
    
    //获取队列的头元素
    public int peek(){
        if(head == null){
            return -1;
        }
        return head.val;//返回队列的头节点
    }
    
    //判断是否为空队列
    public boolean empty(){
        return usedSize==0;
    }

    //返回队列元素个数
    public int getUsedSize(){
        return usedSize;
    }
}

循环队列

循环队列是使用数组来实现
在这里插入图片描述

如果把数组卷起来就变成了环形,但是实现循环队列还需要考虑的一个问题是,如何确定队列是空还是满?

  1. 通过添加计数器
  2. 浪费一个空间
    在这里插入图片描述
  • 力扣练习题: 设计循环队列

双端队列(Deque)

双端队列是指两端都可以进行进队和出队操作的队列

双端队列同时遵守了先进先出和后进先出的原则,所以可以说它是一种把队列和栈相结合的一种数据结构

双端队列既能够当队列使用,也能当栈使用,Java底层是使用双链表(LinkedList)来实现双端队列(Deque)队列(Queue)的 ;
限制一端进行出队或入队的双端队列称为受限的双端队列

在这里插入图片描述
Deque是一个接口,使用时必须创建LinkedList的对象,实际开发中Deque使用的并不是非常多

在这里插入图片描述

面试题

  • 力扣链接: 用队列实现栈

  • 力扣链接: 用栈实现队列

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

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

相关文章

selenium使用

selenium使用一 bs4搜索文档树二 css选择器三 selenium基本使用四 无界面浏览器五 selenium其它用法5.1 登录百度5.2 获取位置属性大小&#xff0c;文本5.3 元素操作5.4 执行js代码5.5 切换选项卡5.6 浏览器前进后退5.7 异常处理六 selenium登录cnblogs获取cookie七 抽屉半自动…

kubernetes使用(1.25)

kubernetes使用&#xff08;1.25&#xff09; 内核是AMD、ARM、 $ arch uname -a 注&#xff1a;x86_64,x64,AMD64基本上是同一个东西 K8S 核心概念 Kubernetes有很多核心概念&#xff0c;我们先看下几个核心的概念。其他概念可以看一下我的安装文档 Deployment Deploy…

实现国产化转型,ZStack Cloud 助力中铁财务数字化转型!

中铁财务是中国中铁旗下的金融服务核心企业&#xff0c;随着新业务的快速发展&#xff0c;原有的烟囱式架构使得资源利用率相对较低&#xff0c;难以与其他系统有效协调工作。基于国产化布局的需要&#xff0c;中铁财务选择了 ZStack Cloud 云平台&#xff0c;在充分利旧的基础…

UNIAPP实战项目笔记47 显示默认收货地址和修改收货地址页面的布局

UNIAPP实战项目笔记47 显示默认收货地址和修改收货地址页面的布局 实际案例图片 显示默认地址 修改收货地址后 地址列表 显示默认地址页面 具体内容图片自己替换哈&#xff0c;随便找了个图片的做示例 具体位置见目录结构 完善布局页面和样式 用到了页面间传值 uni.onu…

[附源码]计算机毕业设计JAVA圆梦山区贫困学生助学系统

[附源码]计算机毕业设计JAVA圆梦山区贫困学生助学系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM…

1163. 按字典序排在最后的子串-解题思路推导

1163. 按字典序排在最后的子串-解题思路推导 给你一个字符串 s &#xff0c;找出它的所有子串并按字典序排列&#xff0c;返回排在最后的那个子串。 示例 1&#xff1a; 输入&#xff1a;s “abab” 输出&#xff1a;“bab” 解释&#xff1a;我们可以找出 7 个子串 [“a”…

刷爆力扣之种花问题

刷爆力扣之种花问题 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#xff0c;每…

YOLOv7 Backbone| 原文源码详解

YOLOv7 Backbone结构详解在之前的文章中&#xff0c;我们以YOLOv5为对象&#xff0c;详细解剖了一只麻雀的内部构造&#xff0c;包括anchor机制、backbone的结构、neck的结构和head的结构。在本篇文章中&#xff0c;我们将以YOLOv7v0.1版本的代码为目标&#xff0c;结合作者团队…

骨骼动画——2D Animation

1、2D骨骼动画 传统的序列帧动画为了达到好的动画效果&#xff0c;理论上来说&#xff0c;图片越多&#xff0c;动作越流畅&#xff0c;往往需要较多的美术资源&#xff0c;虽然效果好但是资源占用较多 而2D骨骼动画是利用3D骨骼动画的制作原理进行制作的&#xff0c;将一张2…

借助 ChatGPT 编写的 libbpf eBPF 工具开发实践教程: 通过例子学习 eBPF

这是一个基于 CO-RE&#xff08;一次编译&#xff0c;到处运行&#xff09;的 libbpf 的 eBPF 的开发教程&#xff0c;提供了从入门到进阶的 eBPF 开发实践指南&#xff0c;包括基本概念、代码实例、实际应用等内容。我们主要提供了一些 eBPF 工具的案例&#xff0c;帮助开发者…

大学免费查题接口

大学免费查题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳…

设计模式-day02

4&#xff0c;创建型模式 4.2 工厂模式 4.2.1 概述 需求&#xff1a;设计一个咖啡店点餐系统。 设计一个咖啡类&#xff08;Coffee&#xff09;&#xff0c;并定义其两个子类&#xff08;美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】&#xff09;&#xff1b;再设…

蓝牙学习六(GATT)

1.简介 GATT-Generic Attribute profle-通用属性配置文件。GATT层是传输真正数据所在的层。包括了一个数据传输和存储架构以及其基本操作。GATT用来规范attribute中的数据内容&#xff0c;并运用group&#xff08;分组&#xff09;的概念对attribute进行分类管理。没有GATT&…

查题接口系统

查题接口系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&#xff09; 题库…

Bootstrap-jqgrid学习(十六)

jqgrid网站地址&#xff1a; jqGrid demos-jqGrid实例-中文-mn886.nethttps://blog.mn886.net/jqGrid/ 表格属性 分页属性&#xff1a; pagerstring定义翻页用的导航栏&#xff0c;必须是有效的html元素。翻页工具栏可以放置在html页面任意位置 显示总条数 viewrecordsbo…

#分支语句详解

第一章 C语言&#xff1a;分支语句 文章目录第一章 C语言&#xff1a;分支语句前言1、什么是语句&#xff1f;2.分支语句&#xff08;选择结构&#xff09;2.1 if语句2.1.1 悬空else2.1.2 if书写形式的对比2.2 switch语句2.2.1 在switch语句中的 break2.2.2 default子句2.2.3 练…

基于频谱的GCN的数学原理

参考链接&#xff1a;如何理解GCN&#xff1f;知乎回答&#xff1a;从热传导模型到GCN从CNN到GCN的联系与区别——GCN从入门到精&#xff08;fang&#xff09;通&#xff08;qi&#xff09; GCN问题本质 图中的每个结点无时无刻不因为邻居和更远的点的影响&#xff0c;而在改…

基于linux的操作系统的通用启动流程(一)

这篇我们讲解linux的通用启动流程,按照我们一贯的方式总分总的节奏,因为后面的每个子系统也很大,所以我们讲解子系统的时候也是按照总分总的方式。注意因为基于linux的各式各样的操作系统绝对不下100个,像嵌入式,然后我们的桌面有fedora,redhat,centos,debian,ubuntu以…

如何定位线上CPU占用过高的问题

系列文章目录 文章目录系列文章目录前言一、定位CPU的流程是什么&#xff1f;二、实操1.测试代码样例2.定位问题实践过程总结前言 一、定位CPU的流程是什么&#xff1f; 项目上线&#xff0c;CPU飙高不下&#xff0c;触发报警&#xff0c;如何定位排查问题。有两种办法1、通过…

JVM内存布局及GC原理

“java的内存布局以及GC原理”是java开发人员绕不开的话题&#xff0c;也是面试中常见的高频问题之一。 java发展历史上出现过很多垃圾回收器&#xff0c;各有各的适应场景&#xff0c;很多网上的旧文章已经跟不上最新的变化。本文详细介绍了java的内存布局以及各种垃圾回收器的…