广告
返回顶部
首页 > 资讯 > 精选 >Java单向队列及环形队列的实现原理是什么
  • 251
分享到

Java单向队列及环形队列的实现原理是什么

2023-06-25 11:06:55 251人浏览 泡泡鱼
摘要

这篇文章主要介绍“Java单向队列及环形队列的实现原理是什么”,在日常操作中,相信很多人在Java单向队列及环形队列的实现原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java单向队列及环形队列的实

这篇文章主要介绍“Java单向队列及环形队列的实现原理是什么”,在日常操作中,相信很多人在Java单向队列及环形队列的实现原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java单向队列及环形队列的实现原理是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    队列的特点

    可以使用数组链表两种方式来实现。

    遵循先入先出(FIFO)的规则,即先进入的数据先出。

    属于有序列表。

    图解实现过程:

    Java单向队列及环形队列的实现原理是什么

    定义一个固定长度的数组,长度为maxSize。

    设置两个指针first = -1(指向队列第一个数据的前一位,这样保证在添加第一个数据以后头指针为0,和数组的下标一样,且用于操作出队)和last = -1(指向队尾,用于操作入队)。

    即first会因为出队操作而增加,last会因为入队操作而增加

    代码实现:

    package 队列;public class ArrayQueueTest {    public static void main(String[] args) {        ArrayQueue arrayQueue = new ArrayQueue(3);        arrayQueue.addQueue("琼");        arrayQueue.addQueue("赟");        arrayQueue.addQueue("珑");        arrayQueue.showAllQueueData();        System.out.println(arrayQueue.getQueue());       }}class ArrayQueue{    private int maxSize;//定义队列的最大长度    private int first ;//指向队列头的前一个位置!!前一个位置!!出队方向    private int last ;//指向队列尾部!!即最后一个数据!!!入队方向    private String[] arr; //先建一个空的数组,具体长度未知,需要maxSize来确定。    //构造器初始化队列信息    public ArrayQueue(int maxSize){        this.maxSize = maxSize;        this.first = -1;        this.last = -1;        arr = new String[maxSize];    }    //判断是否为空    public boolean isEmpty(){        if (first == last) {            System.out.println("队列为空~~");            return true;        }else {            System.out.println("队列不为空~~");            return false;        }    }        //判断队列是否满    public boolean isFull(){        if (last == maxSize-1) {            System.out.println("队列已满~~");            return true;        }else {            System.out.println("队列未满~~");            return false;        }    }    //入队    public void addQueue(String data){        if (last == maxSize-1){            System.out.println("队列已满,不能再添加!!");            return;        }else {            last++; //添加数据只和末尾下标有关            arr[last] = data;            return;        }    }    //出队    public String getQueue(){        if (isEmpty()) {            //因为getQueue方法是int型,需要返回数据,如果无数据,也需要返回            //如果返回-1或者其他数据,会让人误解获取到的数就是-1或者其他            //所以用抛出异常来处理            throw new RuntimeException("队列为空,无数据~~");        }        else {            first++;            return arr[first];        }    }    //遍历队列所有信息    public void showAllQueueData(){        if (first == last){            return;        }        for (int i = 0; i < arr.length; i++) {            System.out.println("arr["+i+"]"+"="+arr[i]);        }    }    //获取队列头数据    public String headQueueData(){        if (isEmpty()){            throw new RuntimeException("无数据~~~");        }        return arr[++first];    }}

    队列缺点:

    由于出队操作,使得first指针上移变大,导致数组前面空出来的位置就不能再继续添加数据,即不能再被重复使用,这样一个队列只能使用一次,内存效率太低,所以需要使用环形队列来优化解决。

    优化解决——环形队列实现思路

    first指针初始默认设置为0,指向队列头部,则arr[first] 就是第一个数据。

    last指针初始默认也为0,但是会随着增加数据而后移。

    队列满的条件:

    (last + 1) % maxSize == first

    last+1是为了让指针后移,而且如果不设置为 last+1 那么一开始的时候last为0 , last % maxSize == 0,且first也为0,还没加数据就满了。

    队列为空的条件:

    first == last

    由于判断是否满的时候: last+1 ,导致实际上可以装的数据比数组长度少 1

    环形队列各步骤及各方法实现讲解

    队列初始化 :

    class CircleArryQueue{    private int maxSize ; //数组长度,即队列最大容量    private int first;   //头指针,控制出队操作    private int last;  //尾指针,控制入队操作    private int[] arr;  //数组类型,可以换其他的。    //构造器初始化信息    public CircleArryQueue(int maxSize){        this.maxSize = maxSize;        this.arr = new int[maxSize];        this.first = 0;//这两个可以不加,不叫也是默认为0        this.last = 0;    }}

    判断队列是否为空:

     public boolean isEmpty(){        //头指针和尾指针一样 则说明为空        return last == first;    }

    判断队列是否满:

    public boolean isFull(){    return (last + 1) % maxSize == first;}

    添加数据到队列尾部:入队

    public void pushData(int data){    //先判断是否满了    if(isFull()){        System.out.println("队列已经满啦~~");        return;    }    arr[last] = data;    //last+1是为了后移,取模是为了避免指针越界,同时可以让指针循环    last = (last + 1) % maxSize;}

    取出队首数据:出队

    public int popData(){        if (isEmpty()) {            //抛异常就可以不用返回数据了            new RuntimeException("队列为空,没有获取到数据~~");        }     //要先把first对应的数组数据保存——>first后移——>返回数据        int value = arr[first];//first+1的操作和last+1是一样的,取模也是         first = (first+1) % maxSize;        System.out.println(value);        return value;    //如果不保存first指针 那么返回的数据就不对了//如果直接返回数据,那first指针还没后移 也不对,所以需要使用第三方变量    }

    展示队列中所有数据:

    public void showAllData(){        if (isEmpty()) {            System.out.println("队列为空,没有数据~~");            return;        }//此处i不为0,是因为有可能之前有过popData()操作,使得firs不为0,所以最好使用    //first给i动态赋值,        for (int i = first; i < first+size() ; i++) {            System.out.println("arr["+i%maxSize+"]"+arr[i%maxSize]);        }

    获取队列中数据的总个数:

    public int dataNum(){//韩顺平老师的教程上是这样写,但是我理解不了..........。return (last+maxSize-first) % maxSize;   }

    查看队首数据但不弹出:

    public void seeFirstData(){    return arr[first];}

    全部代码整合:

    package 练习;import java.util.Scanner;public class CircleArryQueue {    public static void main(String[] args){        CircleQueue circleQueue = new CircleQueue(4);        System.out.println("--------测试环形队列--------");        char key = ' ';        Scanner scanner = new Scanner(System.in);        boolean flag = true;        while (flag){            System.out.println("s(showAllData):查看队列数据");            System.out.println("p(pushData):队尾添加数据");            System.out.println("g(popData):弹出队头数据");            System.out.println("h(seefirstData):获取队头数据");            System.out.println("e(exit):退出程序");            key = scanner.next().charAt(0);            switch (key){                case 's':                    circleQueue.showAllData();                    break;                case 'p':                    System.out.println("输入一个数据:");                    int obj = scanner.nextInt();                    circleQueue.pushData(obj);                    break;                case 'g':                    circleQueue.popData();                    break;                case 'h':                    circleQueue.seeFirstData();                    break;                case 'e':                    scanner.close();                    flag = false;                    break;                default:                    break;            }        }        System.out.println("程序结束~~~");    }}class CircleQueue {    private int maxSize ; //数组长度,即队列最大容量    private int first;   //头指针,控制出队操作    private int last;  //尾指针,控制入队操作    private int[] arr;  //数组类型,可以换其他的。    //构造器初始化信息    public CircleQueue(int maxSize){        this.maxSize = maxSize;        this.arr = new int[maxSize];        this.first = 0;//这两个可以不加,不叫也是默认为0        this.last = 0;    }    public boolean isEmpty(){        //头指针和尾指针一样 则说明为空        return last == first;    }    public boolean isFull(){        return (last + 1) % maxSize == first;    }    public void pushData(int data){        //先判断是否满了        if(isFull()){            System.out.println("队列已经满啦~~");            return;        }        arr[last] = data;        //last+1是为了后移,取模是为了避免指针越界,同时可以让指针循环        last = (last + 1) % maxSize;    }    public int popData(){        if (isEmpty()) {            //抛异常就可以不用返回数据了            throw new RuntimeException("队列为空,没有获取到数据~~");        }        //要先把first对应的数组数据保存——>first后移——>返回数据        int value = arr[first];        //first+1的操作和last+1是一样的,取模也是        first = (first+1) % maxSize;        System.out.println(value);        return value;        //如果不保存first指针 那么返回的数据就不对了        //如果直接返回数据,那first指针还没后移 也不对,所以需要使用第三方变量    }    //查看所有数据    public void showAllData(){        if (isEmpty()) {            System.out.println("队列为空,没有数据~~");        }        //此处i不为0,是因为有可能之前有过popData()操作,使得firs不为0,所以最好使用        //first给i动态赋值,        for (int i = first; i < first+dataNum() ; i++) {            System.out.println("arr["+i%maxSize+"]"+arr[i%maxSize]);        }    }//查看有效数据个数    public int dataNum(){        //韩顺平老师的教程上是这样写,但是我理解不了..........。        return (last+maxSize-first) % maxSize;    }//查看队列第一个数据    public int seeFirstData(){            System.out.println(arr[first]);        return arr[first];            }}

    到此,关于“Java单向队列及环形队列的实现原理是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: Java单向队列及环形队列的实现原理是什么

    本文链接: https://www.lsjlt.com/news/304456.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Java单向队列及环形队列的实现原理是什么
      这篇文章主要介绍“Java单向队列及环形队列的实现原理是什么”,在日常操作中,相信很多人在Java单向队列及环形队列的实现原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java单向队列及环形队列的实...
      99+
      2023-06-25
    • Java 单向队列及环形队列的实现原理
      目录队列的特点图解实现过程:优化解决——环形队列实现思路环形队列各步骤及各方法实现讲解最后:队列的特点 1.可以使用数组和链表两种方式来实现。 2.遵循先入先出(FIFO)的规则,即...
      99+
      2022-11-12
    • Java 循环队列/环形队列的实现流程
      之前,我们使用链表实现了基础队列,链接放在这里可以去康康哟 Java栈和基础队列的实现详解 之所以没有选择数组来实现,是因为每有一个元素出队,数组中所有剩下的元素都需要向前移动一次,...
      99+
      2022-11-13
    • Java队列篇之实现数组模拟队列及可复用环形队列详解
      队列简介 队列是一个有序列表,可以用数组或是链表来实现。 遵循先入先出的原则。即先存入队列的数据,先取出,后存入的后取出。 示意图:(使用数组模拟队列示意图) 有两个分别指向头部...
      99+
      2022-11-12
    • Java阻塞队列的实现原理是什么
      本篇文章给大家分享的是有关Java阻塞队列的实现原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。BlockingQueue接口提供了3个添加元素方法:add:添加元素到...
      99+
      2023-06-17
    • python双端队列的原理是什么
      这篇文章主要介绍python双端队列的原理是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float(浮...
      99+
      2023-06-14
    • java数据结构中顺序队列和循环队列的区别是什么
      这篇文章主要介绍“java数据结构中顺序队列和循环队列的区别是什么”,在日常操作中,相信很多人在java数据结构中顺序队列和循环队列的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java数据结构中...
      99+
      2023-06-20
    • Java动态循环队列是如何实现的
      目录一、队列1.1 定义1.2 抽象数据类型1.3 顺序存储二、数组队列2.1 思路分析2.2 代码实现2.3 数组队列实现2.4 分析三、环形队列3.1 思路分析3.2 代码实现3...
      99+
      2022-11-12
    • java中用数组实现环形队列的示例代码
      本篇文章主要讲述了使用数组实现环形队列的思路以及具体代码 一、队列是什么 我们先来看下百科的解释: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,...
      99+
      2022-11-12
    • 详解Java阻塞队列(BlockingQueue)的实现原理
      阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取...
      99+
      2023-05-31
      java 阻塞队列 ava
    • 怎么在java中利用数组实现一个环形队列
      本篇文章为大家展示了怎么在java中利用数组实现一个环形队列,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系...
      99+
      2023-06-14
    • Java中的循环队列怎么利用数组实现
      这篇文章将为大家详细讲解有关Java中的循环队列怎么利用数组实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。用Java的数组实现一下循环队列。队列的类//循环队列class CirQueu...
      99+
      2023-05-31
      循环队列 java
    • Java队列数据结构的实现方法是什么
      这篇文章主要介绍“Java队列数据结构的实现方法是什么”,在日常操作中,相信很多人在Java队列数据结构的实现方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java队列数据结构的实现方法是什么”的疑...
      99+
      2023-06-22
    • PHP消息队列实现及运用的方法是什么
      这篇文章主要讲解了“PHP消息队列实现及运用的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP消息队列实现及运用的方法是什么”吧!消息队列的概念、原理、实现方式概念队列结构的一...
      99+
      2023-07-04
    • Redis实现延迟队列的方法是什么
      这篇文章主要介绍“Redis实现延迟队列的方法是什么”,在日常操作中,相信很多人在Redis实现延迟队列的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis实现延迟队列的方法是什么”的疑惑有所...
      99+
      2023-07-05
    • RabbitMQ实现延迟队列的两种方式分别是什么
      这期内容当中小编将会给大家带来有关RabbitMQ实现延迟队列的两种方式分别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。定时任务各种各样,常见的定时任务例如日志备份,我们可能在每天凌晨 3 点去备...
      99+
      2023-06-22
    • 定时任务实现的关键DelayQueue延迟队列是什么
      定时任务实现的关键DelayQueue延迟队列是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。今天学习是并发包提供的延迟队列(DelayQueue)。延迟队列说明延迟队...
      99+
      2023-06-19
    • Python虚拟机中列表的实现原理是什么
      这篇文章主要介绍“Python虚拟机中列表的实现原理是什么”,在日常操作中,相信很多人在Python虚拟机中列表的实现原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python虚拟机中列表的实现原理...
      99+
      2023-07-05
    • Java优雅停机的实现及原理是什么
      这篇文章给大家介绍Java优雅停机的实现及原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。优雅停机 这个名词我是服的,如果抛开专业不谈,多好的名词啊!其实优雅停机,就是在要关闭服务之前,不是立马全部关停,而是做...
      99+
      2023-06-17
    • PHP单例模式的原理及实现方法是什么
      本篇内容介绍了“PHP单例模式的原理及实现方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!单例模式Singleton Pattern...
      99+
      2023-07-05
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作