队列、循环队列和双端队列

news2024/11/27 21:54:40

目录

1、队列

1.1 概念

2.2 队列的使用

 2.3 队列模拟实现

2、循环队列

2.1 循环队列的认识 

2.2 设计循环队列 

 3. 双端队列 (Deque)


1、队列

1.1 概念

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

 

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

 2.3 队列模拟实现

首先,我们定义一个MyLinkQueue类,队列的底层是由双向链表实现的,所以在类中我们定义一个节点内部类,代码如下:

public class MyLinkQueue {
    static class ListNode {
        public int val;
        public ListNode prev;
        public ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
    }
    public ListNode head;
    public ListNode last;
    public int usedSize;  //队列中元素个数
} 

接下来是队列相关操作的模拟实现,以下方法均是 MyLinkQueue类的成员方法。

入队列:

直接在链表的结尾加入一个节点即可。

public boolean offer(int val) {
        ListNode node = new ListNode(val);
        if (head == null) {
            head = node;
            last = node;
        }else {
            last.next = node;
            node.prev = last;
            last = last.next;
        }
        usedSize++;
        return true;
    }

出队列:

有以下三种情况: 

1. 队列为空
2. 队列中只有一个元素----链表中只有一个节点---直接删除
3. 队列中有多个元素---链表中有多个节点----将第一个节点删除
public int poll() {
        if (head == null) {
            return -1;
        }
        int retval = head.val;
        if (head.next == null) {
            head = null;
            last = null;
            return retval;
        }
        head = head.next;
        head.prev = null;
        usedSize--;
        return retval;
    }

获取队头元素:

 public int peek() {
        if (head == null) {
            return -1;
        }
        return head.val;
    }

获取队列中有效元素个数: 

 public int size() {
        return usedSize;
    }

检测队列是否为空:

public boolean empty() {
        return head == null;
    } 

 

2、循环队列

2.1 循环队列的认识 

 

循环队列其实是由数组实现的 

队列头:front  队列尾:rear 

rear 是当前可以存放元素的下标,若rear在下标 7 的位置,如何来到下标 0 的位置呢?

通过 rear = (rear+1)%len (len为数组的长度)式子即可实现。

对于循环队列,我们如何区分是空是满呢,有以下方法: 

  • 通过添加 size 属性记录
  • 保留一个位置(浪费一个空间表示满,浪费的空间不放元素)
  • 使用标记

 

保留一个位置(浪费一个空间表示满,浪费的空间不放元素)的方法,则:

循环队列为空的条件:rear = front ;

循环队列为满的条件: (rear+1)%len = front;

 

2.2 设计循环队列 

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 

class MyCircularQueue {
    public int[] elem;
    public int front;
    public int rear;
    public MyCircularQueue(int k) {
        elem = new int[k];
    }

    //进入队列
    public boolean enQueue(int value) {
        if (isFull()) {  //首先要判断队列是否满
            return false;
        }
        elem[rear] = value;  //不满,直接在rear位置插入元素
        rear = (rear+1)%elem.length;  //rear指向下一个位置
        return true;
    }

    //出队列
    public boolean deQueue() {
        if (isEmpty()) {  //首先要判断队列是否为空
            return false;
        }
        front = (front+1)%elem.length;  //将队头front指向下一个位置
        return true;
    }

    //得到队头元素
    public int Front() {
        if (isEmpty()) {
            return -1;
        }
        return elem[front];
    }

    //得到队尾元素
    public int Rear() {
        if (isEmpty()) {
            return -1;
        }
        //在这里我们要判断一下rear此时的位置
        //若rear在下标为 0 的位置,则返回index = elem.length-1位置的元素
        //若不在下标为 0 的位置,则返回index = rear-1位置的元素
        int index = (rear == 0)?elem.length-1:rear-1;
        return elem[index];
    }

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

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

 3. 双端队列 (Deque)

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

 

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

 

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

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

 

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

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

相关文章

Python之Excel——复制一个sheet当做模板,生成多个sheet

目录 专栏导读背景思路1、加载模板2、项目文件2、完整版代码:3、视频演示:4、总结:&#x1f44d; 该系列文章专栏&#xff1a;[Python办公自动化专栏] 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&…

synchronized和死锁介绍

synchronized特性synchronized使用修饰普通方法(对象锁)修饰静态方法&#xff08;类锁&#xff09;修饰代码块&#xff08;明确指定锁的对象&#xff09;非锁竞争情况 死锁死锁是什么&#xff1f;死锁的必要条件循环等待场景程序死锁怎么排除死锁问题怎么解决 标准库的线程安全…

led驱动电源模块能进行自动化测试吗,具体测试方法,流程是?

LED电源模块测试的痛点主要包括以下几点&#xff1a; 测试效率低&#xff1a;传统的LED电源模块测试方法通常采用人工操作&#xff0c;测试效率低下&#xff0c;且易出错。 测试项目不全面&#xff1a;传统的测试方法可能无法覆盖所有的性能指标&#xff0c;导致一些潜在的问…

非洲“支付宝”PalmPay搭载OceanBase:成本降低80%

10 月 30 日&#xff0c;非洲支付公司PalmPay 的核心系统搭载国产自研数据库OceanBase&#xff0c;正式投入使用。PalmPay 也是 OceanBase 首个非洲商业用户。 作为一家非洲领先的金融科技公司&#xff0c;PalmPay 于 2019 年在尼日利亚推出电子钱包应用&#xff0c;其功能类似…

Verilog刷题[hdlbits] :Module cseladd

题目&#xff1a;Module cseladd One drawback of the ripple carry adder (See previous exercise) is that the delay for an adder to compute the carry out (from the carry-in, in the worst case) is fairly slow, and the second-stage adder cannot begin computing …

推荐PHP匿名在线聊天室系统源码

PHP匿名在线聊天室系统源码 自适应PCWAP端 可发语音、图片&#xff0c;修改数据库config\settings.php可拿去搭建专门跟客户聊天的网站。 演示地址&#xff1a;runruncode.com/php/19610.html

AD教程(五)光耦及二极管元件模型的创建

AD教程&#xff08;五&#xff09;光耦及二极管元件模型的创建 二极管元件的创建 放置管脚&#xff0c;设置管脚号和管脚名称&#xff08;一般隐藏&#xff09;绘制三角形 右键放置直线&#xff0c;选择放置多边形&#xff0c;操作逻辑&#xff0c;每次操作都会增加一边&…

【面试精选】00后卷王带你三天刷完软件测试面试八股文

前言 本人普通本科计算机专业&#xff0c;做测试也有3年的时间了&#xff0c;讲下我的经历&#xff0c;我刚毕业就进了一个小自研薪资还不错&#xff0c;有10.5k&#xff08;个人觉得我很优秀&#xff09;&#xff0c;在里面呆了两年&#xff0c;积累了一些的经验和技能&#…

火爆全网,性能测试-Tomcat连接数分析/jprofiler定位接口相应时长(总结)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Tomcat链接数分…

QT之多个界面相互切换 (stackedWidget控件)

TOC Chapter1 QT之多个界面相互切换 (stackedWidget控件) 原文链接 stackedWidget控件&#xff1a; 可以自由在多个widget切换&#xff0c;可以通过点击顶部菜单&#xff0c;显示不同界面&#xff0c;在实际开发中应用很广泛。 QStackedWidget是一个堆栈窗口控件&#xff0c…

tp6使用Spreadsheet报错:Class ‘PhpOffice\PhpSpreadsheet\Spreadsheet‘ not found

问题提示如下&#xff1a; 可能vendor下的 phpoffice是从别的项目拷贝过来的&#xff0c;所以咋都不行 解决办法是删掉vendor下的phpoffice&#xff0c;用composer重新下载 具体操作&#xff1a;1、在项目根目录下cmd执行下面这条命令 composer require phpoffice/phpspread…

【Linux】 shutdown 命令使用

shutdown 命令可以用来进行关机程序&#xff0c;并且在关机以前传送讯息给所有使用者正在执行的程序&#xff0c;shutdown 也可以用来重开机。使用权限&#xff1a;系统管理者。 语法 shutdown [选项] 时间 [警告信息] 命令选项及作用 执行令 man shutdown 执行命令结果 参…

矿山数字化react-native技术点记录

文章目录 1&#xff0c;宽度自适应表格实现2&#xff0c;新建作业手势动画3&#xff0c;tabBar中间midTabBar动态展示4&#xff0c;堆料图实现5&#xff0c;语音识别实现6&#xff0c;待办事项上下滑动切换页面7&#xff0c;装料卸料手势冲突8&#xff0c;首页初始化性能9&…

有活动啦 | 同立海源年终大促,满额赠礼!

秋天是倒放的春天 时间不停流转 四季马不停蹄 转眼间 距离2024年还有59天啦&#xff01; 在这个最美的季节 同立海源&#xff0c;年终大促&#xff0c;携礼而来&#xff01; 关于同立海源 北京同立海源生物科技有限公司&#xff0c;专注细胞和基因治疗&#xff08;CGT&am…

都是80m²小户型,凭啥她家那么好看!福州中宅装饰,福州装修

杨桥新苑 本案来自杨桥新苑的住宅&#xff0c; 质朴弥漫在80㎡的小家&#xff0c; 自然淡雅的木纹&#xff0c;精炼的玄关隔断&#xff0c; 简约的设计里传达着中式的静谧风雅&#xff0c; 简练的空间加入中国元素&#xff0c; 让人从进门开始就沾染一丝艺术气息。 风格&a…

库尔勒春雨社会工作服务中心开展“三金西瓜霜‘爱牙公益行’善网公益资源对接

为进一步增强辖区居民口腔健康观念和口腔保健意识&#xff0c;加大口腔防治知识宣传教育&#xff0c;促进形成良好的口腔健康行为。10月29日&#xff0c;库尔勒市春雨社会工作服务中心联合库尔勒市天山街道未成年人保护站开展“三金西瓜霜‘爱牙公益行’─善网公益资源对接”公…

uniapp原生插件之安卓客户端之间wifi文件传输

插件介绍 安卓客户端之间文件传输&#xff0c;支持大文件传输&#xff0c;Wifi/热点文件传输&#xff0c;轻松传送1G文件 插件地址 安卓客户端之间wifi文件传输 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 使用文档 详细使用文档 示例文件 百度网盘链接&a…

精品Python的旅游数据可视化大屏平台-爬虫-景点门票

《[含文档PPT源码等]精品基于Python的旅游数据可视化平台-爬虫》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Flask 前端技术&…

突破性技术!开源多模态模型—MiniGPT-5

多模态生成一直是OpenAI、微软、百度等科技巨头的重要研究领域&#xff0c;但如何实现连贯的文本和相关图像是一个棘手的难题。 为了突破技术瓶颈&#xff0c;加州大学圣克鲁斯分校研发了MiniGPT-5模型&#xff0c;并提出了全新技术概念“Generative Vokens "&#xff0c…

Java Web 学习笔记(一) —— MySQL(2)

目录 1 约束1.1 约束概述1.2 非空约束1.3 唯一约束1.4 主键约束1.5 默认约束1.6 外键约束 2 数据库设计2.1 数据库设计概述2.2 表关系 3 多表查询3.1 多表查询概述3.2 内连接查询3.3 外连接查询3.4 子查询 4 事务4.1 事务概述4.2 四大特征 1 约束 1.1 约束概述 约束是作用于表…