一、队列的特点

  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. Python&Selenium&Unittest&BeautifuReport 自动化测试并生成HTML自动化测试报告

    一.摘要 本篇博文将介绍如何借助BeautifulReport和HTML模版,生成HTML测试报告的BeautifulReport 源码Clone地址为 https://github.com/Test ...

  2. metal2 里 programmable blending 和image block的区别 语法以及persistent thread group的语法

    programmable blending 刚接触这个概念的时候 挺激动的 因为能解决很多管线里面的问题 比如 切一次rt再切回来 为了做read write same rt 有了这个 就不用切啦 可 ...

  3. C语言之volatile

    emOsprey  鱼鹰谈单片机 2月21日 预计阅读时间: 4 分钟 和 const 不同(关于 const 可以看 const 小节),当一个变量声明为 volatile,说明这个变量会被意想不到 ...

  4. Hivesql中的正则

    ================================================================================================= 一般 ...

  5. 解读>/dev/null 2>&1

    背景 我们经常能在shell脚本中发现>/dev/null 2>&1这样的语句.以前的我并没有去深入地理解这段命令的作用,照搬照用,今天开始去解读>/dev/null 2&g ...

  6. webstorm 2016.3 注册方法

    用license server 的方式吧,activation code 的方式没有找到方法. license server 里写http://idea.iteblog.com/key.php 用li ...

  7. Ubuntu 蓝牙鼠标一段时间失效的问题

    问题: 我有一个小巧的蓝牙鼠标,但有一个问题. 当它不使用一段时间时,它会关闭. 好的我得按按钮把它打开. 但是我发现,在我在蓝牙小程序下单击"连接"之前,它不会再被Ubuntu识 ...

  8. 关于JPA动态SQL查询

    1.继承接口 2.下面是简单的操作---自己写过的,下次再整理一下 public Page<IdddsMember> list(MemberSearch search, Pageable ...

  9. chown 与 chgrp 修改权限用户

    # 改变权限 chmod 777 filepath # 改变所有者 chown test filepath  # 改变所属组 chgrp user filepath chown='change own ...

  10. vue-cli 本地代理 造成session丢失 而登录不上去 解决办法

    本地代理造成session丢失,登录不成功,是由于代理配置造成的 devServer: { port: 8000, proxy:{ '/qiantai':{ target:'线上地址/qiantai' ...