Java:数据结构-队列(Queue)

news2024/11/24 13:53:23

一 队列

队列是一种先进先出的数据结构,队列中的元素按照进入的顺序排列,第一个插入的元素最先被移除。

1.队列的使用 :

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

我们可以通过双链表模拟实现一个Queue

1.入队列(向双向链表位置插入新的节点)

public class MyQueue {
    static class ListNode{
        public ListNode prev;
        public ListNode next;
        public int val;
        public ListNode(int val){
            this.val=val;
        }
    }
    public ListNode head=null;
    public ListNode last=null;
    public int usedSize=0;

    //
    public void offer(int val){
        ListNode node=new ListNode(val);
        if(isEmpty()){
            head=last=node;
        }else {
            last.next=node;
            node.prev=last;
            last=last.next;
        }
        usedSize++;
    }

2.出队列(将队列中的第一个节点移除) 

public class MyQueue {
    static class ListNode{
        public ListNode prev;
        public ListNode next;
        public int val;
        public ListNode(int val){
            this.val=val;
        }
    }
    public ListNode head=null;
    public ListNode last=null;
    public int usedSize=0;

public boolean isEmpty(){
        return usedSize==0;
    }
    public int pop() {
        if (isEmpty()) {

        }
        head = head.next;
        int val1 = head.val;
        if(head!=null){
            head.prev = null;
        }
        usedSize--;
        return val1;
    }
}

3.查询队列的节点

由于队列的规则为先进先出,所以查询的队列为首节点。

public class MyQueue {
    static class ListNode{
        public ListNode prev;
        public ListNode next;
        public int val;
        public ListNode(int val){
            this.val=val;
        }
    }
    public ListNode head=null;
    public ListNode last=null;
    public int usedSize=0;

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

2.循环队列

模拟实现的方法:

1. 通过添加 size 属性记录

2. 保留一个位置

3. 使用标记

循环队列是一个环形队列,我们可以使用舍弃一个位置的方法来实现一个循环队列(保留一个位置)

. - 力扣(LeetCode)

public class MyCircleQueue {
    public int front;
    public int last;
    public int[] elem;
    public MyCircleQueue(int k){
        elem=new int[k+1];
    }
    public boolean enQueue(int value){
        if (isFull()){
            return false;
        }
        elem[last]=value;
        last=(last+1)%elem.length;
        return true;
    }
    public boolean deQueue(){
        if(isEmpty()){
            return false;
        }
        front=(front+1)%elem.length;
        return true;
    }
    public int Last(){
        if (isEmpty()){
            return -1;
        }
        int index=(last==0)?elem.length-1:last-1;
        return elem[index];
    }
    public int Front(){
        if (isEmpty()){
            return -1;
        }
        return front;
    }


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

二 双端队列 (Deque) 

两端都可以进,可以出。 

三 栈和队列的互相实现

1.用队列实现栈

. - 力扣(LeetCode)

class MyQueue {
    public Queue<Integer> qu1;
    public Queue<Integer> qu2;
    public  MyQueue() {
        qu1=new LinkedList<>();
        qu2=new LinkedList<>();
    }

    public void push(int x) {
        if(!qu1.isEmpty()){
            qu1.offer(x);
        }else if(!qu2.isEmpty()){
            qu2.offer(x);
        }else{
            qu1.offer(x);
        }
    }

    public int pop() {
        if(empty()){
            return -1;
        }
        if(!qu1.isEmpty()){
            int size=qu1.size();
            for(int i=0;i<size-1;i++){
                qu2.offer(qu1.poll());
            }
            return qu1.poll();
        }else{
            int size=qu2.size();
            for(int i=0;i<size-1;i++){
                qu1.offer(qu2.poll());
            }
            return qu2.poll();
        }
    }

    public int top() {
        if(empty()){
            return -1;
        }
        if(!qu1.isEmpty()){
            int size=qu1.size();
            int val=0;
            for(int i=0;i<size;i++){
                val=qu1.poll();
                qu2.offer(val);
            }
            return val;
        }else{
            int size=qu2.size();
            int val=0;
            for(int i=0;i<size;i++){
                val=qu2.poll();
                qu1.offer(val);
            }
            return val;
        }

    }

    public boolean empty() {
        return qu1.isEmpty() && qu2.isEmpty();
    }
}

2.用栈实现队列 

. - 力扣(LeetCode)

class MyQueue {
    public ArrayDeque<Integer> s1;
    public ArrayDeque<Integer> s2;
    public MyQueue() {
        s1=new ArrayDeque<>();
        s2=new ArrayDeque<>();
    }
    
    public void push(int x) {
        s1.push(x);
    }
    
    public int pop() {
        if(empty()){
            return -1;
        }
        if(s2.isEmpty()){
        while(!s1.isEmpty()){
            s2.push(s1.pop());
        }
        }
        return s2.pop();
    }
    
    public int peek() {
        if(empty()){
            return -1;
        }
        if(s2.isEmpty()){
        while(!s1.isEmpty()){
            s2.push(s1.pop());
        }
        }
        return s2.peek();
    }
    
    public boolean empty() {
        return s1.isEmpty() && s2.isEmpty();
    }
}

希望能对大家有所帮助!!!! 

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

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

相关文章

说下SSL/TLS四次握手过程?

参考自&#xff1a;SSL/TLS四次握手过程是怎么样的&#xff1f;HTTPS、SSL、TLS三者之间的联系和区别 一.SSL/TLS 简介 SSL(Secure Socket Layer 安全套接层)是基于 HTTPS 下的一个协议加密层&#xff0c;用于解决 HTTP 在传输数据时使用明文而导致的不安全问题。 SSL 是 HT…

2024腾讯全球数字生态大会 | 线上直播活动参与教程

2024腾讯全球数字生态大会 | 线上直播活动参与教程 9月5-6日,2024腾讯全球数字生态大会,共见最新 全景式产品服务矩阵,了解智能科技如何成本优化、 生产提效、重塑商业生态、加速全球布局。 大会亮点 100大咖趋势洞察 100专业白皮书 100开发者活动福利 体验丰富前沿智能应用落…

【OpenCV】(五)—— 图像融合

在OpenCV中&#xff0c;图像融合是指将两张或多张图像合并成一张图像的技术。这种技术在很多场景下都非常有用&#xff0c;比如全景图的拼接、多曝光图像的融合、多焦点图像的融合等。下面是一些常用的图像融合方法和技术&#xff1a; 加权平均法&#xff1a; 这是最简单的图像…

炒短线,伦敦银的价格怎么计算?

伦敦银也就是国际市场上的现货白银交易&#xff0c;这个市场是全球最大的白银交易市场&#xff0c;一直以公平、公正、公开的交易环境&#xff0c;以及高效的清算机制而著称&#xff0c;因此也吸引了全球众多的投资者的关注。根据国际市场中的惯例&#xff0c;伦敦银的合约规格…

JAVA基础 day13 多线程

一、多线程 1.1多线程的创建方法&#xff1f; 1.1.1方式一&#xff1a;继承Thread类 //创建线程的方式之一&#xff1a;继承Thread类 public class demo1 {//main方法本身是由一条主线程推进&#xff0c;这里创建了myThread后&#xff0c;已经是多线程了public static void mai…

瑞_RabbitMQ_Java客户端SpringAMQP

文章目录 1 初识MQ2 RabbitMQ2.1 安装2.1.1 资源准备2.1.2 安装步骤 3 Java客户端SpringAMQP3.1 导入Demo工程&#xff08;含资源&#xff09;3.2 快速入门3.2.0 准备工作3.2.1 消息发送 publisher3.2.2 消息接收 consumer3.2.3 测试 3.3 WorkQueues模型3.3.0 准备3.3.1 消息发…

Vue3获取ref元素的几种方式

静态绑定 获取单个 dom 元素 v-for 中使用 需要注意的是&#xff0c;访问的时候&#xff0c;要确保 ref 引用值已经成功绑定上元素&#xff0c;我们可以使用以下几种方式确保获取

【jeston】torch相关环境安装

参考&#xff1a;玩转NVIDIA Jetson &#xff08;25&#xff09;— jetson 安装pytorch和torchvision 我的jeston信息&#xff1a; torch install 安装环境 conda create -n your_env python3.8 conda activate your_envpytorch_for_jeston 安装.whl文件 验证&#xff1…

Opencv:EignFace算法实现人脸识别

目录 简介 代码实现 结果展示 简介 EigenFace算法是人脸识别领域中的一种经典算法&#xff0c;它基于主成分分析&#xff08;PCA&#xff09;的原理&#xff0c;通过对人脸图像进行特征提取和降维&#xff0c;从而实现对人脸的有效识别。 EigenFace算法的核心思想是将人脸图…

从零实现高并发内存池

目录 1. 项目介绍1.1 这个项目具体功能是什么&#xff1f;1.2 本项目的知识储备 2. 什么是内存池2.1 池化技术2.2 内存池主要解决的问题2.3 malloc 3. 定长内存池设计4. 高并发内存池整体框架设计4.1 Thread Cache的设计思路4.2 Central Cache的设计思路4.3 Page Cache的设计思…

MySQL数据的导入

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

(36)高分辨率频谱——通过在时域序列后面补零提高频域分辨率

文章目录 前言一、仿真分析较少的采集数据1.MATLAB代码2.仿真结果 二、高分辨率频谱1.有限信号样本高分辨率频谱的计算方法2.仿真结果 前言 在实际工程应用中&#xff0c;我们很多时候所能采集的信号并不正好是整周期的。此时若对信号做傅里叶变化&#xff0c;得到的结果中包含…

跨境电商不同节点的物流配送实现

由于涉及到国际运输、清关、仓储和本地配送等复杂环节,跨境物流与国内物流有着显著区别。本文将详细介绍跨境电商的不同物流配送模式,以及从头程到尾程各个节点的实现过程,并讨论相应的电商ERP系统在各个环节中的设计要点。 一、跨境电商的物流配送模式 跨境电商的物流配送…

【C】分支与循环2--while/for/do-while/goto以及break和continue在不同循环中的辨析~

分支与循环 while循环 if与while的对比 if(表达式)语句&#xff1b;while(表达式)语句&#xff1b;下面来看一个例子&#xff1a; 用 if 写&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {if (1)printf("hehe");//if后面条…

数据结构——排序(2)

数据结构——排序(2) 文章目录 数据结构——排序(2)前言&#xff1a;1.快速排序&#xff08;非递归版本&#xff09;基本步骤&#xff1a;代码实现 2.归并排序算法思想&#xff1a;核心步骤&#xff1a;代码实现&#xff1a;特征总结&#xff1a; 3.计数排序&#xff08;非比较…

跨境电商独立站的本地化

随着全球电商的快速发展,越来越多的跨境电商选择建立独立站以摆脱平台限制,打造品牌影响力。独立站的成功不仅依赖于技术能力和供应链管理,更取决于对目标市场的本地化策略。 本文将从网站建设、商品信息展示、SEO推广等方面分析跨境电商独立站如何进行本地化适配,并讨论如…

SMARTFORM 条形码和二维码

本文主要是记录了二维码和条形码的创建以及在SMARTFORMS的使用 文章目录 SMARTFORM 条形码创建新的BARCODE创建条形码样式创建段落样式SMARTFORM调用条形码 SMARTFORM 二维码创建二维码Module Size 调节二维码的尺寸Module Size: 像素值ErrCorrLev : 容错率二维码的使用 SMARTF…

Springboot3+druid+jasypt+application.yml配置文件数据库密码加密技术

说明 开发环境我们经常把数据库密码直接明文暴露在配置文件中,但是在生产环境,出于安全考虑,必须对数据库密码进行加密。 Jasypt是一个简单易用的Java加密工具库。Jasypt支持多种加密算法,如AES、SHA512、AES_256等,以适应不同的安全需求,可以轻松将加密技术应用于配置…

虚拟机错误:‘VirtualBox Host-Only Ethernet Adapter #2‘

这个错误确实让我很难受。同时我也找了很多的方法&#xff0c;最终得到了这种方法是比较有效的。 参考 https://www.virtualbox.org/ticket/16807

2023年“网络建设与运维”广西省赛试题复盘

2023年“网络搭建与应用”省赛试题复盘 第一部分&#xff1a;网络搭建及安全部署项目 &#xff08;500分&#xff09; 一、竞赛内容分布 “网络搭建与应用”竞赛共分二个部分&#xff0c;其中&#xff1a; 第一部分&#xff1a;网络搭建及安全部署项目 第二部分&#xff1a;服…