栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Queue与队列(Java语言)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Queue与队列(Java语言)

Queue与队列(Java语言)

前言Java内置队列

队列对象队列方法

offer(e)方法poll()方法peek()方法 方法的区别

offer()方法和add()方法poll()方法和remove()方法peek()方法和element()方法 Java内置双端队列

双端队列对象双端队列方法 实现队列

节点成员变量和构造方法offer()方法isEmpty()方法poll()方法peek()方法

前言

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

Java内置队列 队列对象

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

public static void main(String[] args) {
        Queue 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 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 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 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 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节点。
好了,队列的相关知识就介绍到这里,数据结构这方面的知识注重理解,死记硬背的效果不明显,多刷题,勤动手是提高水平的不二选择,希望这篇博客能够对你有所帮助,如果有问题或者建议,欢迎私信和评论!谢谢各位。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/715549.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号