一.代码部分

1.定义接口:

public interface Queue<E> {

    void enqueue(E e);
E dequeue();
E getFront();
int getSize();
boolean isEmpty(); }

2.基于数组的实现

public class ArrayQueue<E> implements Queue<E> {

    private ArrayList<E> arrayList;
public ArrayQueue(int capacity){
arrayList = new ArrayList<>(capacity);
}
public ArrayQueue(){
arrayList = new ArrayList<>();
} @Override
public void enqueue(E e) {
arrayList.addLast(e);
} @Override
public E dequeue() {
return arrayList.removeFirst();
} @Override
public E getFront() {
return arrayList.get(0);
} @Override
public int getSize() {
return arrayList.getSize();
} @Override
public boolean isEmpty() {
return arrayList.isEmpty();
} }

3.改进链表实现队列:

public class LinkedListQueue<E> implements Queue<E> {

    //节点,用来存放数据:数据+下一个元素的引用
private class Node{
private E e;
private Node next;
public Node(E e,Node next){
this.e = e;
this.next = next;
}
public Node(E e){
this(e,null);
}
public Node(){
this(null,null);
}
public String toString(){
return e.toString();
}
}
private Node head;//头节点
private Node tail;//尾节点
private int size; public LinkedListQueue(){
head = null;
tail = null;
size =0;
} @Override
public void enqueue(E e) {
if (tail == null){
tail = new Node(e);
head = tail;
}else {
tail.next = new Node(e);
tail = tail.next;
}
size++;
} @Override
public E dequeue() {
if(isEmpty())
throw new IllegalArgumentException("empty");
Node retNode = head;
head = head.next;
retNode.next = null; if (head == null){
tail = null;
}
size--;
return retNode.e;
} @Override
public E getFront() {
if(isEmpty())
throw new IllegalArgumentException("empty");
return head.e;
} @Override
public int getSize() {
return size;
} @Override
public boolean isEmpty() {
return size ==0;
} @Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append("queue:front");
Node cur = head;
while (cur != null){
res.append(cur + "->");
cur = cur.next; }
res.append("null tail");
return res.toString();
}
}

3.循环队列:

public class LoopQueue<E> {

    private E[] data;
private int front;//队列头
private int tail;//队列尾
private int size; /**
* 初始化容量的构造方法
* @param capacity
*/
public LoopQueue(int capacity){
data = (E[]) new Object[capacity+1]; //注意加一
front = 0;
tail = 0;
size = 0;
} /**
* 无参的构造方法
*/
public LoopQueue(){
this(10);
} public int getCapacity(){
return data.length-1;
} public boolean isEmpty(){
return front == tail;
} public int getSize(){
return size;
} /**
* 改变数组容量
* @param newCapacity
*/
private void resize(int newCapacity){
E[] newData = (E[]) new Object[newCapacity+1];
for (int i = 0; i < size; i++) {
newData[i] = data[(i+front)%data.length];
}
data = newData;
front = 0;
tail = size;
} /**
* 入队
* @param e
*/
public void enqueue(E e){
if ((tail+1)%data.length == front){
resize(getCapacity()*2);
}
data[tail] = e;
tail = (tail+1)%data.length;//注意这里不是tail++
size++;
} /**
* 出队
* @return
*/
public E dequeue(){
if (isEmpty()){
throw new IllegalArgumentException("can't dequeue");
}
E ret = data[front];
data[front] = null;
front = (front+1)%data.length;//注意这里不是front++
size--;
if(size == getCapacity()/4 && getCapacity()/2 != 0){
resize(getCapacity()/2);
}
return ret;
} /**
* 队列头
* @return
*/
public E getFront(){
if (isEmpty()){
throw new IllegalArgumentException("queue is empty");
}
return data[front];
} @Override
public String toString() { StringBuilder res = new StringBuilder();
res.append(String.format("queue size =%d, capacity = %d\n"),size,getCapacity());
res.append("front [");
for (int i = front; i != tail; i = (i=1)%data.length) {
res.append(data[i]);
if((i+1)%data.length != tail){
res.append(",");
}
}
res.append("] tail");
return res.toString();
}
}

自己实现数据结构系列四---Queue的更多相关文章

  1. 【JavaScript数据结构系列】03-队列Queue

    [JavaScript数据结构系列]03-队列Queue 码路工人 CoderMonkey 转载请注明作者与出处 1. 认识队列Queue结构 队列,跟我们的日常生活非常贴近,我们前面举例了食堂排队打 ...

  2. <数据结构系列3>队列的实现与变形(循环队列)

    数据结构第三课了,今天我们再介绍一种很常见的线性表——队列 就像它的名字,队列这种数据结构就如同生活中的排队一样,队首出队,队尾进队.以下一段是百度百科中对队列的解释: 队列是一种特殊的线性表,特殊之 ...

  3. 【C#数据结构系列】查找

    一:查找 1.1 基本概念和术语 查找(Search)是在数据结构中确定是否存在关键码等于给定关键码的记录的过程.关键码有主关键码和次关键码.主关键码能够唯一区分各个不同的记录,次关键码通常不能唯一区 ...

  4. <数据结构系列2>栈的实现与应用(LeetCode<有效的的括号>)

    首先想要实现栈,就得知道栈为何物,以下一段摘抄至百度百科: 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底. ...

  5. 【JavaScript数据结构系列】04-优先队列PriorityQueue

    [JavaScript数据结构系列]04-优先队列PriorityQueue 码路工人 CoderMonkey 转载请注明作者与出处 ## 1. 认识优先级队列 经典的案例场景: 登机时经济舱的普通队 ...

  6. 【JavaScript数据结构系列】00-开篇

    [JavaScript数据结构系列]00-开篇 码路工人 CoderMonkey 转载请注明作者与出处 ## 0. 开篇[JavaScript数据结构与算法] 大的计划,写以下两部分: 1[JavaS ...

  7. 前端构建大法 Gulp 系列 (四):gulp实战

    前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gulp专家 前 ...

  8. JAVA数据结构系列 栈

    java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...

  9. Netty4.x中文教程系列(四) 对象传输

    Netty4.x中文教程系列(四)  对象传输 我们在使用netty的过程中肯定会遇到传输对象的情况,Netty4通过ObjectEncoder和ObjectDecoder来支持. 首先我们定义一个U ...

随机推荐

  1. 【合集】Hadoop 合集

    0. 说明 Hadoop 随笔的目录 1. HDFS 主要内容: [HDFS_1] HDFS 的概念和特性 [HDFS_2] HDFS 的 Shell 操作 [HDFS_3] HDFS 工作机制 [H ...

  2. LeetCode算法题-Third Maximum Number(Java实现-四种解法)

    这是悦乐书的第222次更新,第235篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第89题(顺位题号是414).给定非空的整数数组,返回此数组中的第三个最大数字.如果不存 ...

  3. Spring Boot 菜鸟教程 application.properties 常用配置

    SPRING CONFIG (ConfigFileApplicationListener) spring.config.name 配置文件名称,默认为application spring.config ...

  4. Mysql 数据类型 以及约束

    数据类型 整型 默认有符号 无符号(unsigned) 和有符号 用 0 填充 zerofill 约束的作用: 保证数据的完整性 和一致性 tinyint[ -128 , 127 ] 小整数 无符号( ...

  5. C#深度学习の委托深度解析

    一.我们在使用C#的过程中,不可避免的用到了委托. 委托的本质是什么呢? 从语法上看,委托是对方法的抽象封装,例如:public void print1(),public void print2(), ...

  6. 深入理解Ribbon之源码解析

    什么是Ribbon Ribbon是Netflix公司开源的一个负载均衡的项目,它属于上述的第二种,是一个客户端负载均衡器,运行在客户端上.它是一个经过了云端测试的IPC库,可以很好地控制HTTP和TC ...

  7. 笔记-Android中打开各种格式的文件(apk、word、excel、ppt、pdf、音视频、图片等)

    打开后缀.apk的文件.即启动安装程序. //apkFilePath 文件路径 public void installAPK(String apkFilePath) { // 创建URI Uri ur ...

  8. centos7下安装docker(18docker日志---docker logs)

    在微服务架构中,由于容器的数量众多以及快速变化的特性使得记录日志和监控变得越来越重要,考虑到容器的短暂和不固定周期,当我们需要排查问题的时候容器可能不在了.因此,一套集中式的日志管理系统是生产环境中不 ...

  9. 试验一下Golang 网络爬虫框架gocolly/colly

    参考:http://www.cnblogs.com/majianguo/p/8186429.html 框架源码在 github.com/gocolly/colly 代码如下(github源码中的dem ...

  10. PHP删除数组中空值的方法介绍

    这篇文章主要介绍了PHP删除数组中空值的方法介绍,需要的朋友可以参考下 说来惭愧,以前在去掉数组的空值是都是强写foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下: ...