队列(Queue)的顶级理解

这篇具有很好参考价值的文章主要介绍了队列(Queue)的顶级理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.队列(Queue) 的概念

2.单链表模拟实现队列

2.1创建队列

2.2入队列

2.3判断是否为空

2.4出队列

2.5获取队头元素

2.6完整代码:

2.7双向链表模拟实现队列代码

3.数组模拟实现队列代码

3.1创建队列

 3.2判断是否为满

3.3检查是否为空 

 3.4插入元素

 3.5删除元素

 3.6从队首获取元素

3.7 从队尾获取元素

4.双端队列 (Deque)


1.队列(Queue) 的概念

队列 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表, 队列具有先进先出 FIFO(First In First Out)
入队列:进行插入操作的一端称为 队尾( Tail/Rear
出队列:进行删除操作的一端称为队头( Head/Front
队列(Queue)的顶级理解,java,开发语言,经验分享,其他,数据结构
在Java中,Queue是个接口,底层是通过链表实现的。
队列(Queue)的顶级理解,java,开发语言,经验分享,其他,数据结构

队列在使用时有以下方法:

队列(Queue)的顶级理解,java,开发语言,经验分享,其他,数据结构注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。 

Queue<Integer> q = new LinkedList<>();


2.单链表模拟实现队列

2.1创建队列

代码:

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

    public Node head;
    public Node last;
    public int size;
}

2.2入队列

(1)创建一个节点node。

(2)判断该head是否为null,若为null,则该node就是head和last。

(3)若不为null,则 last.next=node, last=node;

(4)size++。

代码:

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

2.3判断是否为空

 public boolean empty(){
        return size==0;
    }

2.4出队列

(1)队列为空,则直接返回队列为空的异常。

自定义异常如下:

public class EmptyException extends RuntimeException{
    public EmptyException(String message) {
        super(message);
    }
}

(2)队列为空不为,先ret=head.val,后删除头结点head=head.next;,再判断ihead是否为null。

如果是last也要置空。

(3)size--。

代码:

    public int poll(){
        if(isEmpty()){
            throw new EmptyException("栈是空的!");
        }
        int ret=head.val;
        size--;
        head=head.next;
        if(head==null){
            last=null;
        }
        return ret;
    }

2.5获取队头元素

代码:

public int peek(){
        if(empty()){
            throw new EmptyException("队列为空");
        }
        int ret=head.val;
        return ret;
    }

2.6完整代码:

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

    public Node head;
    public Node last;
    public int size;

    public void offer(int val){
        Node node = new Node(val);
        if(head==null){
            head=node;
            last=node;
        }else{
            last.next=node;
            last=node;
        }
        size++;
    }
     public int poll(){
        if(isEmpty()){
            throw new EmptyException("栈是空的!");
        }
        int ret=head.val;
        size--;
        head=head.next;
        if(head==null){
            last=null;
        }
        return ret;
    }
    public boolean empty(){
        return size==0;
    }
    public int peek(){
        if(empty()){
            throw new EmptyException("队列为空");
        }
        int ret=head.val;
        return ret;
    }
}

2.7双向链表模拟实现队列代码

public class MyQueue {
    // 双向链表节点
    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) {
            throw new EmptyException("队列为空");
        } 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) {
            throw new EmptyException("队列为空");
        }
        return first.value;
    }
    public int size() {
        return size;
    }
    public boolean isEmpty(){
        return first == null;
    }
}

3.数组模拟实现队列代码

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

循环队列https://leetcode.cn/problems/design-circular-queue/description/描述:

队列(Queue)的顶级理解,java,开发语言,经验分享,其他,数据结构

队列(Queue)的顶级理解,java,开发语言,经验分享,其他,数据结构  队列(Queue)的顶级理解,java,开发语言,经验分享,其他,数据结构

要解决循环队列的有如下几个难题:

(1)数组的下标如何实现循环

rear=(rear+1)%elem.length

 front=(front+1)%elem.length

(2)区分空与满

有三个方法:

  1. 通过添加 size 属性记录

  2. 保留一个位置

  3. 使用标记

本博主采用第二个方法,如下图所示:

队列(Queue)的顶级理解,java,开发语言,经验分享,其他,数据结构

3.1创建队列

由于我们需要浪费一个空间来判断是否为满,在构造方法时多构造一个空间。

class MyCircularQueue {
    private int[] elem;
    private int front;//表示队列的头
    private int rear;//表示队列的尾

    public MyCircularQueue(int k) {
     this.elem=new int[k+1];
    }
}

 3.2判断是否为满

 public boolean isFull() {
        return (rear+1)%elem.length==front;
    }

3.3检查是否为空 

public boolean isEmpty() {
        return rear == front;
    }

 3.4插入元素

(1)判断是否为满,若为满。返回false

(2)若不为满,则在elem下标为rear处插入该元素

(3)队尾向后走一步rear=(rear+1)%elem.length,返回true;

public boolean enQueue(int value) {
     if(isFull()){
         return false;
     }
     elem[rear]=value;
     rear=(rear+1)%elem.length;
     return true;
    }

 3.5删除元素

判断是否为null

(1)若为null。返回false

(2)若不为null,队首向后走一步 front = (front+1)%elem.length;,返回true;

    public boolean deQueue() {
        if (isEmpty()){
            return false;
        }
        front = (front+1)%elem.length;
        return true;
    }

 3.6从队首获取元素

   public int Front(){
        if(isEmpty()){
            return -1;
        }
        return elem[front];
    }

3.7 从队尾获取元素

(1)如果队列为空,返回-1

(2)不为空,如果为队尾下标为0,返回下elem[elem.length-1]的值

(3)下标不为0,返回数组下标为rear-1的值

  public int Rear() {
        if(isEmpty() ) {
            return -1;
        }
        if(rear == 0) {
            return elem[elem.length-1];
        }
        return elem[rear-1];
    }

3.8完整代码

class MyCircularQueue {
    private int[] elem;
    private int front;//表示队列的头
    private int rear;//表示队列的尾

    public MyCircularQueue(int k) {
        this.elem = new int[k + 1];
    }

    public boolean enQueue(int value) {
        if (isFull()) {
            return false;
        }
        elem[rear] = value;
        rear = (rear + 1) % elem.length;
        return true;
    }

    public boolean deQueue() {
        if (isEmpty()){
            return false;
        }
        front = (front+1)%elem.length;
        return true;
    }

    //从队首获取元素。如果队列为空,返回 -1 。
    public int Front() {
        if(isEmpty() ) {
            return -1;
        }
        return elem[front];
    }


    //从队尾获取元素。如果队列为空,返回 -1 。
    public int Rear() {
        if(isEmpty() ) {
            return -1;
        }
        if(rear == 0) {
            return elem[elem.length-1];
        }
        return elem[rear-1];
    }


    //检查循环队列是否为空。
    public boolean isEmpty() {
        return rear == front;
    }


    public boolean isFull() {
        return (rear + 1) % elem.length == front;
    }
}

4.双端队列 (Deque)

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

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

队列(Queue)的顶级理解,java,开发语言,经验分享,其他,数据结构

 在实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口

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

以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 队列(Queue)的顶级理解,java,开发语言,经验分享,其他,数据结构

 队列(Queue)的顶级理解,java,开发语言,经验分享,其他,数据结构文章来源地址https://www.toymoban.com/news/detail-706378.html

到了这里,关于队列(Queue)的顶级理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 100个Java工具类之61:队列类Queue

    Queue类,队列,是一种数据结构,遵循先进先出的原则。 下面通过实例能更好地理解Queue。 add和offer方法都是添加元素。区别是offer添加元素时候,如果队列已满,会返回false,而 add方法会抛出IllegalStateException异常 remove和poll方法都是移除头部元素。区别是poll方法在队列为空时

    2024年02月09日
    浏览(27)
  • Java 【数据结构】 栈(Stack)和队列(Queue)【神装】

      登神长阶  第三神装 S tack    第四神装 Queue    目录 🔋一.栈 Stack 💻1.概念 🖥️2.基本操作  🖨️3.相关OJ题   🖱️4.栈、虚拟机栈和栈帧的区别 🪫二.队列 Queue 🖲️1.概念 💽2.基本操作 🔌三.总结与反思         在 Java 中,栈(Stack)是一种后进先出(LIFO)的数

    2024年04月27日
    浏览(26)
  • HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核基础-消息队列queue

    队列又称消息队列,是一种常用于任务间通信的数据结构。队列接收来自任务或中断的不固定长度消息,并根据不同的接口确定传递的消息是否存放在队列空间中。 任务能够从队列里面读取消息,当队列中的消息为空时,挂起读取任务;当队列中有新消息时,挂起的读取任务

    2024年02月20日
    浏览(38)
  • 从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)

    目录 1. priority_queue的模拟实现 1.1 未完全的priority_queue 1.2 迭代器区间构造和无参构造 1.3 仿函数的介绍和使用 1.4 完整priority_queue代码: 1.5 相关笔试选择题 答案: 2. 反向迭代器 2.1 反向迭代器的普通实现 reverse_iterator.h(不对称版) 2.2 反向迭代器的对称实现 reverse_iterator.

    2024年02月10日
    浏览(38)
  • 实战经验分享:开发同城外卖跑腿小程序

    下文,小编将与大家一同探究同城外卖跑腿小程序的开发实战,包括但不限于技术选型、开发流程、用户体验等多个方面。 1.技术选型 在同城外卖跑腿小程序的开发中,技术选型是至关重要的一环。对于前端,选择了使用Vue.js框架,其灵活性和生态系统的支持使得开发过程更

    2024年02月03日
    浏览(34)
  • 【经验分享】自然语言处理技术有哪些局限性和挑战?

    个人认为,主要是两个难点: 1.语料,通常的语料很好解决,用爬虫从互联网上就可以采集和标注训练。但是我们接触很多项目和客户需求都是专业性很强的,例如:航天材料、电气设备、地理信息、化学试剂 等等。往往很多素材和语料都是很宝贵的,而且都是这些企业的内

    2024年02月21日
    浏览(36)
  • 面试经验分享 | 某康安全开发工程师

    DOM型xss和别的xss最大的区别就是它不经过服务器,仅仅是通过网页本身的JavaScript进行渲染触发的。 平常用的多的是MySQL数据库,像Oracle数据库也有了解,但是用的不多。 我的研究方向是自然语言处理,具体的领域是虚假信息检测。我的小论文中采用的数据集是twitter15和twit

    2024年04月15日
    浏览(46)
  • 使用Unity开发手机AR项目经验分享

           AR技术发展到现在也不新鲜了,开发AR的SDK也是五花八门,怎么选择是个问题。这篇文章提供了一套整体开发AR思路,还有后续兼容性问题的解决思路。         Unity开发手机AR项目主要是集成的ARCore和ARKit,ARCore面向Android手机而ARKit面向IOS,从Unity2019后Unity官方使用

    2024年02月11日
    浏览(38)
  • Java 应用部署包优化经验分享

    背景 最近接手了一个 2018 年的老项目,因为太久远了,功能上的代码不敢乱动,虽然是老项目,但最近一年也在持续加功能,功能不稳定,于是我就进入了救火式改 Bug 的状态。 功能不能妄动,但是这个项目还有一个问题,打包模块打出的全量包部署不起来。拿到这个项目的

    2024年01月21日
    浏览(76)
  • 我的ESP-01S开发历程与经验分享

    一、总体说明 本人是个外行,没事搞一下单片机纯属业余爱好而已。学习历程为51——Arduino——NodeMcu_ESP-8266——STM32。做过几样东西,倒是觉得很有趣,也便有了继续学习下去的动力。ESP系列是入门级和业余爱好者开发物联网的不二之选。ESP-01S小开发板对于做简单的物联网

    2023年04月27日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包