队列是一种先进先出的数据结构,队列中插入元素和删除元素分别位于队列的两端。

在Java中 队列实现类众多,本文不再赘述。本文探讨的是如何自定义队列实现类:

基于数组方式实现队列:

注意点:

当出队时队首为空,如果不移动队列元素那么会使得队尾在插入元素过程中越界,因队首为空,数组实际使用空间小于数组的大小,所有要移动队列的元素。

而且每次出队都要移动,使得耗费大量的时间。

import java.util.Arrays;

public class ArrayQueue<E> {
Object[] queue;
int size; public ArrayQueue() {
queue = new Object[10];
} public boolean isEmpty() {
return size == 0;
} //入队
public void offer(E data) {
ensureCapacity(size+1);
queue[size++] = data;
} //出队
public E poll() {
if (isEmpty()) return null;
E data = (E) queue[0];
System.arraycopy(queue, 1, queue, 0, size-1); //填满空位
size--;
return data;
} //扩容
private void ensureCapacity(int size) {
if (size > queue.length) {
int len = queue.length + 10;
queue = Arrays.copyOf(queue, len);
}
} public static void main(String[] args) {
ArrayQueue<Integer> queue = new ArrayQueue<>(); for (int i = 0; i < 20; i++) {
queue.offer(i);
}
for (int i = 0; i < 10; i++) {
System.out.println("出队元素:"+queue.poll());
}
}
}

基于链表实现的队列

由于链表的地址是不连续的的所以无须扩容。出队和入队都非常快。

class ListNode<E> {
ListNode<E> next = null;
E data;
public ListNode(E data) {
this.data = data;
}
} public class ListQueue<E> { private ListNode<E> head = null; //队首
private ListNode<E> end = null; //队尾 public boolean isEmpty() {
return head == null;
} //入队
public void offer(E e) {
ListNode<E> node = new ListNode<E>(e);
if (isEmpty()) {
head = node;
end = node;
return;
}
end.next = node;
end = node;
} //出队
public E poll() {
if (isEmpty()) return null;
E data = head.data;
head = head.next;
return data;
} public static void main(String[] args) {
ListQueue<String> queue = new ListQueue<>();
System.out.println("入队");
queue.offer("first");
queue.offer("second");
System.out.println("出队"+queue.poll());
System.out.println("出队"+queue.poll());
}
}

Java Queue 队列的更多相关文章

  1. atitit. java queue 队列体系and自定义基于数据库的队列总结o7t

    atitit. java queue 队列体系and自定义基于数据库的队列总结o7t 1. 阻塞队列和非阻塞队列 1 2. java.util.Queue接口, 1 3. ConcurrentLink ...

  2. atitit. java queue 队列体系and自己定义基于数据库的队列总结o7t

    atitit. java queue 队列体系and自己定义基于数据库的队列总结o7t 1. 堵塞队列和非堵塞队列 1 2. java.util.Queue接口. 1 3. ConcurrentLin ...

  3. Java Queue队列

    前言 Queue队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用.  ...

  4. java集合类——Stack栈类与Queue队列

    Stack继承Vector类,它通过五个操作对类 Vector 进行了扩展. 栈是 后进先出的. 栈提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法.测试堆栈是否为空的 em ...

  5. 使用goroutine+channel和java多线程+queue队列的方式开发各有什么优缺点?

    我感觉很多项目使用java或者c的多线程库+线程安全的queue数据结构基本上可以实现goroutine+channel开发能达到的需求,所以请问一下为什么说golang更适合并发服务端的开发呢?使用 ...

  6. java数据结构——队列、循环队列(Queue)

    每天进步一点点,坚持就是成功. 1.队列 /** * 人无完人,如有bug,还请斧正 * 继续学习Java数据结构————队列(列队) * 队列和栈一样,都是使用数组,但是队列多了一个队头,队头访问数 ...

  7. JDK QUEUE队列

    Java  Queue基础 Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构. offer,add区别: 一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被 ...

  8. lesson2:java阻塞队列的demo及源码分析

    本文向大家展示了java阻塞队列的使用场景.源码分析及特定场景下的使用方式.java的阻塞队列是jdk1.5之后在并发包中提供的一组队列,主要的使用场景是在需要使用生产者消费者模式时,用户不必再通过多 ...

  9. Java消息队列-Spring整合ActiveMq

    1.概述 首先和大家一起回顾一下Java 消息服务,在我之前的博客<Java消息队列-JMS概述>中,我为大家分析了: 消息服务:一个中间件,用于解决两个活多个程序之间的耦合,底层由Jav ...

随机推荐

  1. IDEA社区版(Community)和付费版(UItimate)的区别

    比对类型 Ultimate(终极版,付费) Community(社区版,免费) 语言支持 Java Java Groovy Groovy Kotlin Kotlin Scala(通过插件) Scala ...

  2. JZOJ8月6日提高组反思

    JZOJ8月6日提高组反思 又是愉快的没落的一天 被2020&2018暴打day2 一堆人AK-- T1 看到这个\(m\)只有100 就坚定了我打暴力的信心 离散化加暴力匹配 原本就想\(3 ...

  3. 【NOIP2015模拟11.5】JZOJ8月5日提高组T3 旅行

    [NOIP2015模拟11.5]JZOJ8月5日提高组T3 旅行 题目 若不存在第\(k\)短路径时,输出"Stupid Mike" 题解 题意 给出一个有\(n\)个点的树 问这 ...

  4. Java进阶专题(十八) 系统缓存架构设计 (下)

    前言 上章节介绍了Redis相关知识,了解了Redis的高可用,高性能的原因.很多人认为提到缓存,就局限于Redis,其实缓存的应用不仅仅在于Redis的使用,比如还有Nginx缓存,缓存队列等等.这 ...

  5. 安装rose遇到的问题

    将rose文件夹里面的rose.rar直接解压到rose安装目录里面的common文件夹中 安装教程与问题解决连接https://blog.csdn.net/Farewell_w/article/de ...

  6. 分布式文件系统HDFS-部署和配置

    1 部署HDFS HDFS的基本操作可以分为集群管理和文件系统操作两种类型: 集群管理:包括Namenodede 的格式化.集群的启动和停止.集群信息查看等. 文件系统:包括对目录.文件和权限等内容的 ...

  7. jquery.sticky 粘性滚动插件使用

    一个jQuery插件,使你能够做任何元素在您的网页上总是可见的,可以作为顶部固定导航显示插件. 官网地址:http://stickyjs.com/ github:https://github.com/ ...

  8. Python(三) PIL, Image生成验证图片

    Python(三) PIL, Image生成验证图片 安装好PIL,开始使用. 在PyCharm中新建一个文件:PIL_Test1.py 1 # PIL 应用练习 2 # 3 # import PIL ...

  9. 【题解】「AT4266」[ABC113B] Palace

    AT4266 [ABC113B] Palace 水题解*n translation 有 \(n\) 个地方,第 \(i\) 个地方的海拔为 \(H_i\),该地方的温度为 \(T-H_i \times ...

  10. 【坑点集合】C++ STL 使用注意事项整理

    Intro 简单整理了一些关于 C++ STL 的注意点. 虽然大多数东西可以手写不过某些东西最好少造轮子,善用 STL 可以节约很多考场时间,简化实现. 当然是时空限制和功能足够的前提下. Tips ...