Java----队列(Queue)

news2025/2/23 14:20:17

目录

1.队列(Queue)

1.1概念

1.2队列的使用

1.3队列的模拟实现

1.4循环队列

1.4.1循环队列下标偏移

1.4.2如何区分队列是空还是满

1.5双端队列 (Deque)


1.队列(Queue)

1.1概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头 (Head/Front)

生活实例:

食堂排队打饭,先排队的先打到饭 

1.2队列的使用

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

队列的方法:

方法功能
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());
   }
}

1.3队列的模拟实现

队列中既然可以存储元素,那底层肯定要有能够保存元素的空间,通过前面线性表的学习了解到常见的空间类型有 两种:顺序结构和链式结构。

public class Queue {
    // 双向链表节点
    public static class ListNode{
        ListNode next;
        ListNode prev;
        int value;
 
        ListNode(int value){
            this.value = value;
       }
   }
 
    ListNode first;   // 队头
    ListNode last;    // 队尾
    int size = 0;
 
    // 入队列---向双向链表位置插入新节点
    public void offer(int e){
        ListNode newNode = new ListNode(e);
        if(first == null){
            first = newNode;
            // last = newNode;
       }else{
            last.next = newNode;
            newNode.prev = last;
            // last = newNode;
       }
 
        last = newNode; 
        size++;
   }
 
    // 出队列---将双向链表第一个节点删除掉
    public int poll(){
        // 1. 队列为空
        // 2. 队列中只有一个元素----链表中只有一个节点---直接删除
        // 3. 队列中有多个元素---链表中有多个节点----将第一个节点删除
        int value = 0;
        if(first == null){
            return null;
       }else if(first == last){
            last = null;
            first = null;
       }else{
            value = first.value;
            first = first.next;
            first.prev.next = null;
            first.prev = null;
       }
        --size;
        return value;
   }
 
    // 获取队头元素---获取链表中第一个节点的值域
    public int peek(){
        if(first == null){
            return null;
       }
 
        return first.value;
   }
 
    public int size() {
        return size;
   }
 
    public boolean isEmpty(){
        return first == null;
   }
}

1.4循环队列

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

1.4.1循环队列下标偏移

往后偏移offset个单位

index是当前位置数组下标,offset是需要往后走的单位

偏移后数组下标计算:(index+offset)%array.length

往前偏移offset个单位

index是当前位置数组下标,offset是需要往后走的单位

偏移后数组下标计算:(index+array.length-offset)%array.length

往前走offset步就相当于往后走array.length-offset步

1.4.2如何区分队列是空还是满

1. 通过添加 size 属性记录,如果size等于数组长度则满,否则不满

2. 保留一个位置,

3. 使用标记,判断尾的下一个是不是头

622. 设计循环队列 - 力扣(LeetCode)

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

你的实现应该支持如下操作:

  • MyCircularQueue(k): 构造器,设置队列长度为 k 。
  • Front: 从队首获取元素。如果队列为空,返回 -1 。
  • Rear: 获取队尾元素。如果队列为空,返回 -1 。
  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
  • isEmpty(): 检查循环队列是否为空。
  • isFull(): 检查循环队列是否已满。

方法:

class MyCircularQueue {

private int front;
private int rear;
private int[]arr;
private int k;

    public MyCircularQueue(int k1) {
k=k1+1;
arr=new int[k];
    }
    
    public boolean enQueue(int value) {
if(isFull()){
    return false;
}
arr[rear]=value;
rear=(rear+1)%k;
return true;
    }
    
    public boolean deQueue() {
if(isEmpty()){
    return false;
}
front=(front+1)%k;
return true;
    }
    
    public int Front() {
if(isEmpty()){
    return -1;
}
return arr[front];
    }
    
    public int Rear() {
if(isEmpty()){
    return -1;
}
return arr[(rear-1+k)%k];
    }
    
    public boolean isEmpty() {
return front==rear;
    }
    
    public boolean isFull() {
return (rear+1)%k==front;
    }
}

1.5双端队列 (Deque)

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。 那就说明元素可以从队头出队和入队,也可以从队尾出队和入队

Deque是一个接口,使用时必须创建LinkedList的对象。

Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现
Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现

用队列实现栈

225. 用队列实现栈 - 力扣(LeetCode)

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

方法:

使用两个队列,队列一用来存储数据,队列二始终保持空,当入栈时,将数据入队到队列二,然后将队列一的数据出队后入队到队列二,将队列一和队列二互换,使得队头放后放入的数据,队尾放先放入的数据,完成入栈

出栈:出队队列一

top:返回队列一的队头元素

判断是否为空:调用isEmpty方法判断队列是否为空

class MyStack {
        Queue<Integer>que1;
        Queue<Integer>que2;

    public MyStack() {
que1=new LinkedList<>();
que2=new LinkedList<>();
    }
    
    public void push(int x) {
que2.offer(x);
while(!(que1.isEmpty())){
    que2.offer(que1.poll());
}
Queue<Integer>tmp=que1;
que1=que2;
que2=tmp;
    }
    
    public int pop() {
return que1.poll();
    }
    
    public int top() {
return que1.peek();
    }
    
    public boolean empty() {
return que1.isEmpty();
    }
}

用栈实现队列

232. 用栈实现队列 - 力扣(LeetCode)

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

方法:

创建两个栈,一个用来模拟入队,一个用来模拟出队,入队时,压栈进stack1,出队时先调用peek方法,然后再stack2出栈,peek方法是先判断stack2是否为空,不为空返回栈顶元素,为空就看stack1是否也为空,都为空说明队列为空,不为空就将stack1的元素出栈再压栈到stack2中,然后返回stack2的栈顶元素

判断是否为空,就判断两个栈是否都为空

class MyQueue {
private Stack<Integer> stack1;
private Stack<Integer> stack2;

    public MyQueue() {
stack1=new Stack<>();
stack2=new Stack<>();
    }
    
    public void push(int x) {
stack1.push(x);
    }
    
    public int pop() {
peek();
return stack2.pop();
}
    
    
    public int peek() {
        if(!stack2.isEmpty()){
            return stack2.peek();
        }
        if(stack1.isEmpty()){
            return -1;
        }
while(!stack1.isEmpty()){
    stack2.push(stack1.pop());
}
return stack2.peek();
    }
    
    public boolean empty() {
return stack1.isEmpty()&&stack2.isEmpty();
    }
}

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

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

相关文章

GraphRAG:全局搜索方法在RAG系统中的应用

GraphRAG&#xff1a;全局搜索方法在RAG系统中的应用 传统RAG系统的局限性全局搜索方法的优势全局搜索的工作流程关键配置参数实现考虑结论 在检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;系统中&#xff0c;传统的基线方法在处理需要跨…

怀旧必玩!重返童年,扫雷游戏再度登场!

Python提供了一个标准的GUI&#xff08;图形用户界面&#xff09;工具包&#xff1a;Tkinter。它可以用来创建各种窗口、按钮、标签、文本框等图形界面组件。 而且Tkinter 是 Python 自带的库&#xff0c;无需额外安装。 Now&#xff0c;让我们一起来回味一下扫雷小游戏吧 扫…

数据结构与算法-13高级数据结构_树论(BtreeB+Tree)

Btree&BTree 1 btree-定义 B-树是一种自平衡的树形数据结构&#xff0c;它能够保持数据的有序性&#xff0c;并允许搜索、顺序访问、插入和删除操作都在对数时间内完成。与二叉树不同&#xff0c;B-树的每个节点可以拥有多于两个的子节点&#xff0c;这取决于树的阶&#…

* 快速排序的深入优化探讨

在算法设计领域&#xff0c;快速排序因其卓越的平均性能与广泛的应用场景而备受推崇。自1960年Tony Hoare提出以来&#xff0c;它已成为许多编程语言标准库中的核心排序方法。然而&#xff0c;随着数据规模的不断扩大和计算需求的日益复杂化&#xff0c;对快速排序进行更深入的…

docker环境下的verdaccio设置权限并配置域名.md

权限配置 一个管理员叫admin,可以读也可以发布一个普通用户叫qiuye,只可以读,不可以发布添加账号就自行创建添加即可,只需要更改config文件的配置项即可 packages:*/*: access: admin qiuyepublish: admin unpublish: admin **:access: admin qiuyepublish: admin unpublish…

数据结构系列-插入排序和希尔排序

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 排序的概念 常见的排序算法&#xff1a; 插入排序 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a; 把待排序的记录按其关键码值的大小逐个插入到…

如何合规与安全地利用专业爬虫工具,构建企业数据竞争优势

摘要&#xff1a; 本文深入探讨了在当今大数据时代&#xff0c;企业如何通过合规且安全的方式运用专业爬虫工具&#xff0c;有效收集并分析海量信息&#xff0c;进而转化为企业独有的数据优势。我们不仅会介绍最佳实践&#xff0c;还会讨论关键技术和策略&#xff0c;帮助企业…

virtuoso tran仿真中如何画出temperature的瞬态曲线

virtuoso tran仿真中如何画出温度的瞬态曲线&#xff1f; 在tran仿真中如果加入了瞬态热效应&#xff0c;设置Dynamic parameter&#xff0c;即时间随温度变化&#xff0c;如何plot temp vs. time曲线&#xff1f; 1.电路中加一根线和变量名相同 2.ADE L/XL Test Editor->Ou…

如何在安卓设备上运行Linux(使用termux+图形界面)加上换源等优化

我学生嘛&#xff0c;喜欢讲故事&#xff0c;你看看我大部分文章开头&#xff0c;都会有"事情的起因"一类话 当然这次也不例外哦 我最新获得了一个新平板&#xff0c;华为的matepad air&#xff0c;很喜欢。想捣鼓&#xff0c;不太懂&#xff0c;但好像鸿蒙不能直接…

MyBatis中的赋值语句:#{}和${}的区别差异(常见面试题)

我们开始先总结他们的差异&#xff0c;后面再使用代码展示差异 1.0.#{}和${}的差异 &#xff08;1&#xff09;${}可能存在sql注入的安全问题 &#xff08;2&#xff09;${}是即时sql&#xff08;参数直接拼接&#xff09;&#xff0c;不能进行缓存&#xff1b;#{}是预编译sq…

基于单文档的MFC图像增强

目录 function.h ColorEnhanceDib.h ColorEnhanceDib.cpp Dib.h Dib.cpp FrequencyFilterDib.h FrequencyFilterDib.cpp GrayTransformDib.h GrayTransformDib.cpp HistogramDib.h HistogramDib.cpp SharpenProcessDib.h SharpenProcessDib.cpp SmoothProcessDib.h Sm…

【Spring Boot】自动配置源码解析

目录 Spring-Boot-Starter一、准备配置类和 Bean 对象二、自动配置条件依赖三、Bean 的参数获取3.1 EnableConfigurationProperties 注解3.2 ConfigurationProperties 注解 四. Bean 的发现4.1 自己项目的 Bean 扫描4.2 jar 包的 Bean 扫描 五. Bean 的加载 自动配置总结 Sprin…

Linux系统编程——生产者消费者模型

目录 一&#xff0c;模型介绍 1.1 预备知识&#xff08;超市买东西的例子&#xff09; 1.2 模型介绍 1.3 CP模型特点 二&#xff0c;基于阻塞队列的CP模型 2.1 介绍 2.2 阻塞队列的实现 2.3 主函数实现 2.4 效果展示 三&#xff0c;POSIX信号量 3.1 信号量原理 3…

Date已不再推荐?为什么我们需要新的 Java 日期时间 API?(LocalDate、LocalDateTime、LocalTime 、Instant)

日期时间 API 是 Java 8 版本的最大功能之一。Java 从一开始就缺少一致的日期和时间方法&#xff0c;而 Java 8 日期时间 API 是对核心 Java API 的一个受欢迎的补充。 为什么我们需要新的 Java 日期时间 API&#xff1f; 在开始研究 Java 8 日期时间 API 之前&#xff0c;让我…

蛋仔派对S18赛季攻略

本人蛋仔名&#xff1a;Z周明昊帅哥&#xff08;稍微自恋了一点&#xff09;&#x1f60e; 没夺冠的心情&#xff0c;请看下图&#xff1a; 呜呜呜…… 蛋仔五小只人形&#xff1a; 观看视频 完结撒花^_^ BUY&#xff01;&#xff01;&#xff01;

31-库文件的制作与使用——静态库文件与动态库文件

31-库文件的制作与使用——静态库文件与动态库文件 一、库文件介绍 库文件是在计算机编程中用来存放变量、函数和类的文件&#xff0c;提供给开发者开箱即用的资源。库文件分为静态库和动态库两种&#xff0c;二者在程序链接阶段的行为不同&#xff1a; 静态库&#xff1a;在…

HALCON如何添加外部函数

1、在HALCON菜单栏中点击【编辑】选择【参数选择】或者 点击【函数】选择【管理函数】进入到参数窗口&#xff1b; 2、在参数窗口下依次选择【函数】、【目录】和【添加】操作&#xff1b; 3、外部函数添加成功后&#xff0c;其他程序文件均可使用该外部函数。

自定义prometheus监控获取nginx_upstream指标

1、前言 上篇文章介绍了nginx通过nginx_upstream_check_module模块实现后端健康检查&#xff0c;这篇介绍一下如何自定义prometheus监控获取nginx的upstream指标来实时监控nginx。 2、nginx_upstream_status状态 支持以下三种方式查看nginx_upstream的状态 /status?formatht…

【C++】标准库:介绍string类

string 一.string类介绍二.string类的静态成员变量三.string类的常用接口1.构造函数&#xff08;constructor&#xff09;2.析构函数&#xff08;destructor&#xff09;3.运算符重载&#xff08;operator&#xff09;1.operator2.operator[]3.operator4.operator 4.string的四…

Kitti数据集解析

目录 一、概述 2、详细内容 1、lable标签 2、标定参数 3、点云数据 C++代码读取bin文件 python代码读取bin文件 三、功能实现 1、点云数据转成投影到图像 2、图像数据转成投影到点云 3、点云3D结果转成图像BEV鸟瞰图结果 一、概述 KITTI整个数据集是在德国卡尔斯鲁厄…