一、队列的特点

  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. 关于SendMessage和PostMessage的理解的例子

    对于SendMessage 和 PostMessage 平时口头的解释是 SendMessage 发送消息后等待返回, PostMessage 发送消息后立即返回 . 但是这样解释还是不具体,什么叫等 ...

  2. 生成器(generator) 详解

    1. 生成器是什么? 利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成.但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成 ...

  3. 学习elasticsearch(一)linux环境搭建(3)——head插件安装

    对于5.x的es,head插件不支持 ./elasticearch-plugin install [plugin_name]方式安装. 进入正文 1.首先确保你的机器安装了python,如果没有,请看 ...

  4. 【转载】SELENIUM2支持无界面操作(HTMLUNIT和PHANTOMJS)

    SELENIUM2支持无界面操作(HTMLUNIT和PHANTOMJS) selenium2支持通过各种driver(FirfoxDriver,IternetExplorerDriver,OperaD ...

  5. SARS病毒 (生成函数 + 快速幂)

    链接:https://ac.nowcoder.com/acm/contest/992/A来源:牛客网 题目描述 目前,SARS 病毒的研究在世界范围内进行,经科学家研究发现,该病毒及其变种的 DNA ...

  6. Mapreduce案例之Pi值估算

    题目: 这个程序的原理是这样的.假如有一个边长为1的正方形.以正方形的一个端点为圆心,以1为半径,画一个圆弧,于是在正方形内就有了一个直角扇形.在正方形里随机生成若干的点,则有些点是在扇形内,有些点是 ...

  7. LiteOS的内核——RTOS基本的特性

    在其他的rtos中,基本上也有类似的功能,ucos freertos,要是rtos的时候,务必选择自带的rtos功能,和裸机运行时有区别的

  8. mybatis sql语句中转义字符

    问题: 在mapper  ***.xml中的sql语句中,不能直接用大于号.小于号要用转义字符 解决方法:   1.转义字符串 小于号    <    < 大于号    >    & ...

  9. mysql数据库的主从同步,实现读写分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器来处理如此多的数据库连接操作,数据库必然会崩溃,特别 ...

  10. P2303 [SDOI2012]Longge的问题 我傻QwQ

    莫比乌斯反演学傻了$QwQ$ 思路:推式子? 提交:2次 错因:又双叒叕没开$long\space long$ 题解: $\sum_{i=1}^n gcd(i,n)$ $=\sum_{d|n}d\su ...