Java初阶数据结构队列的实现

news2025/1/11 4:04:26

1.队列的概念

1.队列就是相当于排队打饭

2.在排队的时候就有一个队头一个队尾。

3.从队尾进对头出

4.所以他的特点就是先进先出

所以我们可以用链表来实现

单链表实现要队尾进队头出{要有last 尾插头删}

双向链表实现效率高:不管从哪个地方当作队列都是可以的,所以Linklist是神大拇指高高竖起,

所以队列是很简单的,只要写一个头删和尾部删除很简单

2.队列的代码实现 

2.1普通队列的实现

我们用双向链表来队队列进行实现

很简单就不细说了,想更好了解的到链表那边去看一看。

(1)定义一个基本的双向链表

 (2)用双向链表来实现入队

自己看把比较简单看过链表文章都会

package queuedemo;

public class MyQueue {
    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 void offer(int val){
        ListNode node =new ListNode(val);
        if (head == null){
            head = last = node;
        }else{
            last.next = node;
            last = node;
        }
    }
    public void poll(){
        if (head == null){
            return;
        }
        head = head.next;
        head.prev = null;
    }
    public boolean Empty(){
        return head == null;
    }
    public int peek(){
        if (head == null){
            return -1;
        }
        return head.val;
    }
}

3.双端多了Deque是双端队列,两边都可以进出java包中有

2.2.循环数组(循环队列的实现原理)

1.可以保证空间不被浪费

2.定义一个front rear 这两个用来标记数据,然后rear再清零再循环到0位置继续往后,就变成循环队列了

3.这个有点抽象我们用 一个圆盘图来讲解(卷起来的数组)

开始rear和front斗士在0位置

现在有12 23 34 45 67 78 89

放一个往后面rear走一个,当rear和front相遇的时候就满了

(1)rear和front相遇有空的和满的情况

(2)如果放完下一个是front就是满的(浪费一个空间)

(3)定义一个usedSized来计数,没rear走一次就加一如果和数组长度一样了那么就是满的

(4)加一个标记第一次相遇时true 第二次就是满这样解决。

        其中rear和front满足一个关系就是,通过这个关系可以来更好的实现

         rear = (rear+1)%|len|

                          

我们通过牛客上面一个题来队循环队列来进行实现

. - 力扣(LeetCode)//这是网址自己进去练习

这里我会在idea中演示代码

出队就是front往后面走,入队就是rear往后面走,记得要判断队列是否都满了控了。

代码实现

package queuedemo;

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+1) % elem.length;
        return true;
    }
    //删除队头元素
    public boolean deQueue() {
        if(isEmpty()) {
            return false;
        }
        front = (front + 1) % elem.length;
        return true;
    }
    //得到队头元素 不删除
    public int Front() {
        if(isEmpty()) {
            return -1;
        }
        return elem[front];
    }

    //得到队尾元素 不删除
    public int Rear() {
        if(isEmpty()) {
            return -1;
        }
        int index = (rear == 0) ? elem.length-1 : rear-1;
        return elem[index];
    }

    //判空 front和rear相遇
    public boolean isEmpty() {
        return front == rear;
    }

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

 2.3双端队列

双端队列指的时两边都可以进出

实现代码是这样

Deque stack = new ArrayDeque<>();//双端队列的线性实现//意味着你不仅可以当作队列也可以当作栈来使用,所以stack不唯一

Deque queue = new LinkedList<>();//双端队列的链式实现 比特就

2.4队列实现栈

两个队列才能实现栈

当两个队列都是空的时候,放到第一个队列,

再次入栈的时候方到不为空的队列

出栈的时候出刀到不为空的队列出size-1个元素

剩下的就是我要出栈的元素

. - 力扣(LeetCode)题目这个就是队列实现栈

代码实现

package testdemo;

import java.util.LinkedList;
import java.util.Queue;

class MyStack {

    private Queue<Integer> qu1;
    private Queue<Integer> qu2;

    public MyStack() {
        qu1 = new LinkedList<>();
        qu2 = new LinkedList<>();
    }

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

    public int pop() {
        if(empty()) {
            return -1;
        }
        //找到不为空的队列 出size-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();
        }
    }
    //peek
    public int top() {
        if(empty()) {
            return -1;
        }
        //找到不为空的队列 出size-1个元素
        if(!qu1.isEmpty()) {
            int size = qu1.size();
            int tmp = -1;
            for (int i = 0; i < size; i++) {
                tmp = qu1.poll();
                qu2.offer(tmp);
            }
            return tmp;
        }else {
            int size = qu2.size();
            int tmp = -1;
            for (int i = 0; i < size; i++) {
                tmp = qu2.poll();
                qu1.offer(tmp);
            }
            return tmp;
        }
    }

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

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

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

相关文章

学习JAVA的第二十一天(基础)

多线程 线程&#xff1a; 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 进程&#xff1a; 程序的基本执行实体 并发&#xff1a; 在同一时刻&#xff0c;有多个指令在单个CPU上交替执行 并行&#xff1a; 在同一时刻&…

uniapp h5 部署

uniapp 配置 服务器文件路径 打包文件结构 //nginx 配置 server {listen 8300;server_name bfqcwebsiteapp;charset utf-8;#允许跨域请求的域&#xff0c;* 代表所有add_header Access-Control-Allow-Origin *;#允许带上cookie请求add_header Access-Control-Allow-C…

利用Anaconda创建环境

利用Anaconda创建环境 1. 创建环境的步骤 1. 创建环境的步骤 1.在终端中&#xff0c;使用以下命令创建一个新的 Anaconda 环境。假设您想要创建一个名为 myenv 的环境&#xff1a; conda create --name myenv2.如果您想指定 Python 版本&#xff0c;可以在创建环境时添加版本号…

改三行代码就发了SCI一区?基于全面学习策略的Jaya算法!学会你也可以!CEC2017效果极佳!

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原始Jaya算法 改进Jaya算法策略详解&…

使用Golong轻松实现JWT身份验证

使用Golong轻松实现JWT身份验证 JSON Web Tokens (JWT)是一种流行的安全方法&#xff0c;用于在两个方之间表示声明。在Web应用程序领域&#xff0c;它们通常用作从客户端向服务器传输身份信息&#xff08;声明&#xff09;的方式。本教程将引导您逐步实现Go应用程序中的JWT身份…

操作系统内功篇:硬件结构之CPU是如何运行的?

本文分5个小结&#xff0c;分别是图灵机工作方式&#xff0c;冯诺依曼结构&#xff0c;总线线路位宽和CPU位宽&#xff0c;程序执行的基本过程&#xff0c; a12的具体执行过程。 一 图灵机的工作方式 图灵机由纸带&#xff0c;读写头组成。读写头上有一些部件例:存储单元&#…

java集合框架——List集合概述及ArrayList,LinkedList的区别

前言&#xff1a; List系列集合是Collection集合中两个系列的其中一个&#xff0c;整理下笔记。打好基础&#xff0c;daydayup&#xff01; 需要了解Collection的&#xff0c;可以看这篇java集合框架——Collection集合概述 List系列集合 List系列集合的特点为添加的元素有序&…

python-0007-django模版

介绍 模版是对js&#xff0c;html等资源的封装 新建 在项目路径下新建模版文件夹templates&#xff08;可以为其他名称&#xff09;&#xff0c;要是想细分业务的话&#xff0c;还可以在templates路径下继续建文件夹。如下图&#xff1a; 注册模版 在项目的settings找到T…

分布式链路追踪(一)SkyWalking(1)介绍与安装

一、介绍 1、简介&#xff1a; 2、组成 以6.5.0为例&#xff0c;该版本下Skywalking主要分为oap、webapp和agent三部分&#xff0c;oap和webapp分别用于汇总数据和展示&#xff0c;这两块共同组成了Skywalking的平台&#xff1b;agent是探针&#xff0c;部署在需要收集数据的…

深入解析C++树形关联式容器:map、set及其衍生容器的使用与原理

文章目录 一、引言二、关联式容器的中的 paira.pair 的创建及使用b.pair 间的比较 三、 map 与 set 详解1. map 的基本操作2. set 的基本操作3.关联式容器的迭代器 四、 multimap 与 multiset 的特性五、关联式容器的使用技巧与注意事项1. 键值类型的选择与设计2. 自定义比较函…

STM32第八节:位带操作——GPIO输出和输入

前言 我们讲了GPIO的输出&#xff0c;虽然我们使用的是固件库编程&#xff0c;但是最底层的操作是什么呢&#xff1f;对&#xff0c;我们学习过51单片机的同学肯定学习过 sbit 修改某一位的高低电平&#xff0c;从而实现对于硬件的控制。那么我们现在在STM32中有没有相似的操作…

【AI+编程】利用chatGPT编写python程序处理日常excel工作提升效率小技巧

之前写过一篇AI编程相关的文章 【人工智能】为啥我最近很少写python编程文章了&#xff0c;浅谈AI编程RPA提升工作效率 。 最近有同学私信我&#xff0c;怎么利用AI编程来提升工作效率&#xff0c;除了文章里讲的 使用AI帮忙写算法、代码提示、代码优化、不同语言转换(如J…

如何简化漏洞管理生命周期

如今&#xff0c;由于系统中的漏洞数量不断增加&#xff0c;各种规模的组织都面临着巨大的挑战。截至 2024 年 2 月&#xff0c;国家漏洞数据库是漏洞数据的综合来源&#xff0c;报告了超过 238,000 个案例。网络安全漏洞可能会导致严重后果&#xff0c;包括关键流程中断、敏感…

SSA-LSTM多输入回时序预测 | 樽海鞘优化算法-长短期神经网络 | Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&a…

最新CLion + STM32 + CubeMX 开发环境搭建

网上有不少相关教程&#xff0c;但都是基于老版本Clion&#xff0c;新版有一些改变&#xff0c;但整体是简单了。 PS&#xff1a;本教程基于CLion 2023.3.4 安装所需工具参考&#xff1a;Clion搭建stm32开发环境&#xff08;STM32F103C8T6&#xff09;&#xff0c;有这一篇就够…

C# 第三方 UI 库

C# 的第三方 UI 库提供了丰富的界面控件和组件&#xff0c;可以帮助开发者快速构建现代化、功能丰富的桌面应用程序。以下是一些常见的 C# 第三方 UI 库&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。…

深入了解 大语言模型(LLM)微调方法

引言 众所周知&#xff0c;大语言模型(LLM)正在飞速发展&#xff0c;各行业都有了自己的大模型。其中&#xff0c;大模型微调技术在此过程中起到了非常关键的作用&#xff0c;它提升了模型的生成效率和适应性&#xff0c;使其能够在多样化的应用场景中发挥更大的价值。 那么&…

vscode通过多个跳板机连接目标机(两种方案亲测成功)

1、ProxyJump&#xff08;推荐使用&#xff09; 需要OpenSSH 7.3以上版本才可使用&#xff0c;可用下列命令查看&#xff1a; ssh -V ProxyJump命令行使用方法 ssh -J [email protected]:port1,[email protected]:port2 一层跳板机&#xff1a; ssh dst_usernamedst_ip -…

聚观早报 | 小米汽车SU7将发布;一加Ace 3V渲染图曝光

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 3月13日消息 小米汽车SU7将发布 一加Ace 3V渲染图曝光 禾赛科技2023营收财报 荣耀Magic6至臻版开启预售 老板电…

【05】消失的数字

hellohello~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5;所属专栏&#xff1a;C语言函数实现 感谢大家的观看与支持&#x1f339;&#x1f339;&#x1f339; 有问题可以写在评论区或者私信我哦…