IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Queue与队列(Java语言) -> 正文阅读

[Java知识库]Queue与队列(Java语言)

前言

上篇博客中我们介绍了栈Stack的相关知识,我们知道栈的特点是先进后出的,而这篇博客将介绍队列Queue的相关知识。希望能够对你有所帮助!

Java内置队列

队列对象

在Java中Queue类是一个接口,因此我们不能通过new直接创建对象,而是要通过子类创建。

public static void main(String[] args) {
        Queue<Integer> queue =new LinkedList<>();
    }

队列方法

队列常用的基本有6种,其中3个为一组。

错误处理抛出异常返回特殊值
入队列add(e)offer(e)
出队列remove()poll()
队首元素element()peek()

我们以方法offer(e),poll(),peek()为例

offer(e)方法

形式:boolean offer(E e);
解释:在队列中插入一个元素e
例子:

public static void main(String[] args) {
        Queue<Integer> queue =new LinkedList<>();
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
    }

poll()方法

形式:E poll();
解释:移除队首的元素。
例子:

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.poll());
    }

结果:
在这里插入图片描述

peek()方法

形式:E peek();
解释:返回队首元素,但不移除。
例子:

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.peek());
        System.out.println(queue.peek());
    }

结果:
在这里插入图片描述
相对应的方法add(),remove()方法,element()方法也是类似的效果。那么有什么区别呢?

方法的区别

相对应方法的区别只是在错误的处理上不一样。

offer()方法和add()方法

一些队列有大小的限制,因此如果想在一个满的队列中加入一个新的元素,多出的元素就会被拒绝。add()方法的处理是抛出一个uncheked的异常,而offer()方法不会抛出异常,只是得到offer()方法返回的false

poll()方法和remove()方法

remove()方法和poll()方法都是从队列中删除第一个元素。同样的,remove()方法在遇到队列为null时,会抛出异常,而poll()方法只会返回null。

peek()方法和element()方法

element()和peek()用于在队列的头部查询元素。与remove()方法类似,在队列为空时,element()抛出一个异常,而peek()返回null。

Java内置双端队列

在Java中除了普通的队列还有双端队列,和普通的队列的区别就在于双端队列能够两端进两端出,因此简单介绍一下。

双端队列对象

在Java中Deque类是一个接口,因此我们同样不能通过new直接创建对象,而是要通过子类创建。

 public static void main(String[] args) {
        Deque<Integer> deque =new LinkedList<>();
    }

双端队列方法

双端队列常用方法和普通队列方法类似,我们就简单介绍一下,不作为重点。

头部/尾部队首队首队尾队尾
错误处理抛出异常返回特殊值抛出异常返回特殊值
入队列addFirst(e)offerFirst(e)addLast(e)offerLast(e)
出队列removeFirst()pollFirst()removeLast()pollLast()
获取元素getFirst()peekFirst()getLast()peekLast()

实现队列

为了能够更好的学习队列,我们通过代码自己实现队列。

节点

与栈不同,栈我们可以通过数组头插法就可以实现栈的增删(时间复杂度为O(1)),但是队列是先进先出,我们通过链表的首尾节点才可以完成增删(时间复杂度为O(1))。

class Node {
    public int val;
    public Node next;

    public Node(int val) {
        this.val = val;
    }
}

成员变量和构造方法

public class MyQueue {
    public Node head;
    public Node last;
    
    public MyQueue(){
        
    }
}

队列可以用单链表实现,但是为了时间复杂度为O(1)需要用到首尾节点,构造方法可以省略不写。

offer()方法

public void offer(int val) {
        Node node = new Node(val);
        if (head == null) {
            head = node;
            last = node;
        } else {
            last.next = node;
            last = last.next;
        }
    }

采用尾插法的方法,如果head节点为null,那么让head和last都为node节点,否则,node节点接到last节点后,并且last往后移动。

isEmpty()方法

public boolean isEmpty() {
        return this.head == null;
    }

如果head为null返回true,如果head不为null,返回false。

poll()方法

public int poll() {
        if (isEmpty()) {
            throw new RuntimeException("队列为null");
        }
        int oldVal = head.val;
        this.head = head.next;
        return oldVal;
    }

如果队列为null,则抛出异常,否则用oldVal存储head的val值,head往后移动,并返回oldVal。

peek()方法

public int peek(){
        if (isEmpty()) {
            throw new RuntimeException("队列为null");
        }
        return head.val;
    }

与poll()方法类似,不同在于不要移动head节点。
好了,队列的相关知识就介绍到这里,数据结构这方面的知识注重理解,死记硬背的效果不明显,多刷题,勤动手是提高水平的不二选择,希望这篇博客能够对你有所帮助,如果有问题或者建议,欢迎私信和评论!谢谢各位。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:26:52  更:2022-01-25 10:27:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:52:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码