一、队列的特点

  1、队列是线性结构

  2、先进先出,先进入队列的排在队列前端,会比后进队列的先出队列。FIFO

二、通过数组来实现队列

//自己实现数组队列,队列的特定就是先进先出
public class MyArrayQueue<E> { //用数组来保存
private Object[] queue; //队列容量
private int capacity; //队列中元素的个数
private int size; //队列头部元素对应的下标
private int head; //队列的尾部的下一个位置下标
private int tail; public MyArrayQueue(int capacity){
this.capacity = capacity;
this.queue = new Object[capacity];
} //将元素加入到队列的队尾,如果队列空间不足,抛出异常
public boolean add(E e) throws Exception{
//先确定空间是否足够,已经满了就抛出异常
if(size == capacity){
throw new Exception("queue full");
}
//没满就加入到队尾
queue[tail] = e;
//计算新的队尾
tail = (tail+1) % capacity;
size ++;
return true;
} //返回并删除队列头部的元素,如果队列为空,抛出异常
public E remove() throws NoSuchElementException{
//判断是否为空,为空则报错
if(size == 0){
throw new NoSuchElementException();
}
E removed = elementData(head);
//将头部元素设置为null
queue[head] = null;
//重新计算head的值
head = (head+1) % capacity;
size -- ;
return removed;
} //将元素加入到队尾,如果队列已经满了,返回false
public boolean offer(E e){
//先确定空间是否足够,已经满了就返回false
if(size == capacity){
return false;
}
//没满就加入到队尾
queue[tail] = e;
//计算新的队尾
tail = (tail+1) % capacity;
size ++;
return true;
} //返回并删除队列头部的元素,如果队列为空,返回null
public E poll(){
//判断是否为空,为空则返回null
if(size == 0){
return null;
}
E removed = elementData(head);
//将头部元素设置为null
queue[head] = null;
//重新计算head的值
head = (head+1) % capacity;
size -- ;
return removed;
} //返回队列头部的元素,如果队列为空,抛出异常
public E element(){
//判断是否为空,为空则报错
if(size == 0){
throw new NoSuchElementException();
}
E e = elementData(head);
return e;
} //返回队列头部的元素,如果队列为空,返回null
public E peek(){
//判断是否为空,为空则返回null
if(size == 0){
return null;
}
E e = elementData(head);
return e;
} @SuppressWarnings("unchecked")
private E elementData(int index) {
return (E) queue[index];
} }

三、通过链表来实现队列

//使用链表来实现队列
public class MyLinkedQueue<E> { //节点,保存元素信息,通过next指向下一个节点,形成单链表
private static class Node<E>{
E item;
Node<E> next;//下一个节点 Node(E e, Node<E> next){
this.item = e;
this.next = next;
}
}
//容量
private int capacity;
//元素个数
private int size;
//头节点
private Node<E> head;
//尾节点
private Node<E> tail; //构造函数
public MyLinkedQueue(int capacity){
this.capacity = capacity;
} //将元素加入到队列的队尾,如果队列空间不足,抛出异常
public boolean add(E e) throws Exception{
//先确定空间是否足够,已经满了就抛出异常
if(size == capacity){
throw new Exception("queue full");
}
//创建一个新的节点,然后添加到队列尾部
Node<E> node = new Node<E>(e,null);
if(size == 0){//如果队列为空
head = tail = node;
}else{//如果队列中已经有节点了
tail.next = node;
tail = node;
}
size ++;
return true;
} //返回并删除队列头部的元素,如果队列为空,抛出异常
public E remove() throws NoSuchElementException{
//判断是否为空,为空则报错
if(size == 0){
throw new NoSuchElementException();
}
E e = head.item;
head.item = null; //方便GC
//将head指向下一个节点
head = head.next;
if(head == null){//删除后队列为空,头节点和尾节点都为null
tail = null;
}
size -- ;
return e ;
} //将元素加入到队尾,如果队列已经满了,返回false
public boolean offer(E e){
//先确定空间是否足够,已经满了就返回false
if(size == capacity){
return false;
}
//创建一个新的节点,然后添加到队列尾部
Node<E> node = new Node<E>(e,null);
if(size == 0){//如果队列为空
head = tail = node;
}else{//如果队列中已经有节点了
tail.next = node;
tail = node;
}
size ++;
return true;
} //返回并删除队列头部的元素,如果队列为空,返回null
public E poll(){
//判断是否为空,为空则返回null
if(size == 0){
return null;
}
E e = head.item;
head.item = null; //方便GC
//将head指向下一个节点
head = head.next;
if(head == null){//删除后队列为空,头节点和尾节点都为null
tail = null;
}
size -- ;
return e ;
} //返回队列头部的元素,如果队列为空,抛出异常
public E element(){
//判断是否为空,为空则报错
if(size == 0){
throw new NoSuchElementException();
}
E e = head.item;
return e;
} //返回队列头部的元素,如果队列为空,返回null
public E peek(){
//判断是否为空,为空则返回null
if(size == 0){
return null;
}
E e = head.item ;
return e;
} }

java数据结构之自定义队列的更多相关文章

  1. Java数据结构——双端队列

    双端队列(Deque)双端队列是指允许两端都可以进行入队和出队操作的队列,其元素的逻辑结构仍是线性结构.将队列的两端分别称为前端和后端,两端都可以入队和出队.Deque继承自Queue接口,Deque ...

  2. java 数据结构与算法---队列

    原理来自百度百科 一.队列的定义 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插 ...

  3. java数据结构-10循环队列

    一.概念: 循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用 二.代码实现: @SuppressWarnings("unchecked" ...

  4. Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用

    Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...

  5. java 数据结构 队列的实现

    java 数据结构队列的代码实现,可以简单的进行入队列和出队列的操作 /** * java数据结构之队列的实现 * 2016/4/27 **/ package cn.Link; import java ...

  6. 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  7. Java数据结构和算法 - 栈和队列

    Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...

  8. Java数据结构和算法(五)——队列

    队列.queue,就是现实生活中的排队. 1.简单队列: public class Queqe { private int array[]; private int front; private in ...

  9. 【Java】 大话数据结构(7) 循环队列和链队列

    本文根据<大话数据结构>一书,实现了Java版的循环队列.链队列. 队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 1.循环队列 队列的顺序储存结构:用数组存储队列,引入 ...

随机推荐

  1. PAT乙级1042

    题目链接 https://pintia.cn/problem-sets/994805260223102976/problems/994805280817135616 题解 用数组count存储字母出现 ...

  2. Java入门第二季——第4章 多态

    第4章 多态 多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作 4-1 Java 中的多态 注意:不能通过父类的引 ...

  3. Java 扫描微信公众号二维码,关注并自动登录网站

    https://blog.csdn.net/qq_42851002/article/details/81327770 场景:用户扫描微信公众号的二维码,关注后自动登录网站,若已关注则直接登录. 逻辑: ...

  4. UUID值

    生成这种值:b28043c8-fdb7-4c9e-8df5-b869d38f829d

  5. .net core Areas区域

    //使用MVC app.UseMvc(routes => { routes.MapRoute( name: "areas", template: "{area:ex ...

  6. WebUI自动化之Java语言提高

    单独写一个函数和把函数写在类中的区别: 单独写一个函数,函数只能完成一个功能,团队开发.让第三方使用时比较麻烦: 项目管理和构建自动化工具Maven:

  7. js中Ajax工作原理(转)

    在写这篇文章之前,曾经写过一篇关于AJAX技术的随笔,不过涉及到的方面很窄,对AJAX技术的背景.原理.优缺点等各个方面都很少涉及null.这次写这篇文章的背景是因为公司需要对内部程序员做一个培训.项 ...

  8. Jenkins忘记admin密码补救措施

    遇到将Jenkins登录名密码忘记的情况,下面的方式可以重置密码. 进入C:\Program Files (x86)\Jenkins\users 目录可以看到admin开头的文件夹,里面有个confi ...

  9. 在Postman脚本中发送请求(pm.sendRequest)

    Postman的Collection(集合)/Folder(集合的子文件夹)/Request(请求)都有Pre-request script和Tests两个脚本区域, 分别可以在发送请求前和请求后使用 ...

  10. python 系统模块 OS

    os.system("系统命令")  调用系统命令 os.system("task kill /f /im 系统的进程") 关闭系统进程 os.listdir( ...