数组实现Java 自定义Queue队列及应用操作

数组实现Java 自定义Queue队列及应用操作

队列(Queue)是一种基本数据结构,它在算法和程序设计中得到了广泛应用。队列主要是用来存储和管理一系列元素,并在这些元素中进行插入和删除操作。本篇攻略将详细介绍如何用Java数组来实现自定义队列,并列举相应的应用操作。

Queue定义

队列最基本的功能就是FIFO(先进先出),可在队列尾插入一个元素,也可在队列头删除一个元素。队列的操作分为如下几种:

  • Insert:在队列尾插入一个元素
  • Delete: 在队列头删除一个元素
  • Peek:获取队列头元素
  • isEmpty:判断队列是否空
  • isFull:判断队列是否已满

数组实现Java自定义Queue队列

下面我们将用Java语言来实现队列。为了方便起见,我们先定义一个简单的队列类,包含两个成员变量——队列的大小和队列元素数组:

public class MyQueue{
    private int size;
    private int[] elements;
}

Insert操作

队列的Insert操作主要涉及到向队列尾插入一个元素。如果队列已满则不能再插入元素。否则将新元素插入,同时将队尾指针往后移动。

public boolean add(int element){
    if(size == elements.length){ //判断队列是否已满
        return false;
    }
    elements[size++] = element; //将新元素插入队列尾
    return true;
}

Delete操作

队列的Delete操作主要涉及到删除队列头元素。如果队列为空则不能进行此操作。否则将队头指针往后移动,并返回被删除的元素。

public int remove(){
    if(size == 0){ //判断队列是否为空
        throw new NoSuchElementException();
    }
    int removedElement = elements[0]; //获取队头元素
    System.arraycopy(elements, 1, elements, 0, --size); //将元素往前移动
    return removedElement;
}

Peek操作

Peek操作主要涉及到获取队列头元素,但并不删除该元素。如果队列为空则返回null,否则返回队头元素。

public int peek(){
    if(size == 0){ //判断队列是否为空
        return null;
    }
    return elements[0];
}

isEmpty操作

isEmpty操作直接判断队列当前的元素个数是否为0即可。

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

isFull操作

isFull操作判断队列当前的元素个数是否等于队列的大小。

public boolean isFull(){
    return size == elements.length;
}

队列应用示例

  1. 实现二叉树层序遍历

队列一般用在树的遍历上,广度优先搜索就是基于队列的。

具体实现方式:从队列中取出一个元素作为根节点,将根节点的左右儿子放入队列尾,然后从队列头取出下一个节点作为待遍历的节点,同样将其左右儿子放入队列尾…依次循环直到队列为空。

public void levelOrderTraversal(TreeNode node) {
    if (node == null)
        return;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(node);
    while (!queue.isEmpty()) {
        TreeNode tmp = queue.poll();
        System.out.print(tmp.value + " ");
        if (tmp.left != null) {
            queue.offer(tmp.left);
        }
        if (tmp.right != null) {
            queue.offer(tmp.right);
        }
    }
}
  1. 实现热土豆游戏

热土豆游戏是一种经典的应用场景,它采用了队列数据结构,游戏中的玩家形成一个队列。在游戏中,一旦开始传递土豆,它就以一定的速度在玩家之间传递下去,直到时间结束,最后持有土豆的玩家输掉游戏。

具体实现方法:将各个玩家的编号存入数组,将一个编号数组进行自定义队列存储,随着传递次数的增加,队头出队并重新插入队尾,模拟土豆传递的过程。

public int lastRemaining(int n, int m) {
    Queue<Integer> queue = new LinkedList<>();
    for (int i = 0; i < n; i++) {
        queue.offer(i);
    }
    while (queue.size() > 1) {
        for (int i = 0; i < m - 1; i++) {
            queue.offer(queue.poll());
        }
        queue.poll();
    }
    return queue.poll();
}

以上就是关于数组实现Java自定义Queue队列及应用操作的详细攻略,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:数组实现Java 自定义Queue队列及应用操作 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 微信小程序后台解密用户数据实例详解

    微信小程序后台解密用户数据实例详解 微信小程序开发中获取用户信息是一个常见的需求,而用户信息是加密的,需要在后台进行解密。本文将详细讲解解密用户数据的过程及相关注意事项。 准备工作 在进行解密用户数据之前,需要先获取到用户信息加密数据(encryptedData)和加密密钥(session_key),具体获取方式请参考微信小程序官方文档。 解密过程 步骤一:…

    Java 2023年5月30日
    00
  • java集合与数组的相同点和不同点

    Java中的数组和集合都是用来存储一组元素的数据结构,但它们在具体的使用方法、特点和功能上都有一些不同点。 相同点 都是用来存储一组元素的数据结构。 都可以通过下标或迭代器遍历其中的元素。 存储数据之前,都需要定义其具体的数据类型。 不同点 长度:Array的长度是固定的,而集合的长度可以动态地改变。 内存分配:数组的内存空间是连续的,而集合的实现方式是基于…

    Java 2023年5月26日
    00
  • 详细解读Java的Lambda表达式

    详细解读Java的Lambda表达式 Lambda表达式是Java 8引入的一个重要新特性,它使得代码更加简洁、易读。本文将详细解读Java的Lambda表达式的相关使用,包括Lambda表达式是什么,Lambda表达式的语法和特点,以及示例说明。 Lambda表达式是什么 Lambda表达式是一种简洁的语法形式,可以替代匿名内部类。Lambda表达式可以用…

    Java 2023年5月26日
    00
  • 纯JSP+DWR实现三级联动下拉选择菜单实现技巧

    纯JSP+DWR实现三级联动下拉选择菜单,可以参考以下步骤: 首先创建一个JSP页面,其中需要引入DWR JavaScript库和JQuery,这里以使用CDN资源为例: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit…

    Java 2023年6月15日
    00
  • 带你入门java雪花算法原理

    带你入门java雪花算法原理 概述 雪花算法(Snowflake)是 Twitter 开源的分布式 id 生成算法,以其独特的 id 生成方式,广泛用于分布式系统中唯一 id 的生成,保证了分布式系统中数据的唯一性。 原理 雪花算法生成的 id 是一个 64 位的 long 型整数,其中: 1 bit:表示不可用,Java long 类型的高位是符号位,正数…

    Java 2023年5月19日
    00
  • java判断字符串包含某个字符的实例方法

    针对“java判断字符串包含某个字符的实例方法”,我可以提供以下攻略: 1. 通过contains方法判断字符串是否包含某个字符 针对判断字符串是否包含某个字符的场景,可以使用Java中的String类的contains方法。该方法的签名如下: public boolean contains(CharSequence s) 其中,CharSequence表示…

    Java 2023年5月26日
    00
  • java常用数据流应用实例解析

    Java常用数据流应用实例解析 Java中的数据流用于操作输入和输出流,读取和写入数据。Java提供了多个数据流类来完成各种数据读写操作。本文将详细讲解Java常用数据流的使用方法并给出两个实例说明。 常用数据流 Java的常用数据流包括InputStream、OutputStream、Reader和Writer等,这些类都有其各自的子类。我们将分别介绍这些…

    Java 2023年5月26日
    00
  • 基于Java实现中文分词系统的示例代码

    下面是详细讲解基于Java实现中文分词系统的示例代码的完整攻略。 什么是中文分词 中文分词是将一段中文文本按照词语粒度切分,使每个词语都能成为文本独立处理的基本单位。中文分词是自然语言处理领域中的基础任务,其重要性不言而喻。 中文分词的实现 中文分词的实现方法有很多种,包括基于词典的正向最大匹配算法、逆向最大匹配算法、双向最大匹配算法等,也包括基于机器学习模…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部