import java.util.Iterator;

import java.util.NoSuchElementException;

/**
* 使用链表来实现队列
* 1.考虑结点的结构,包括当前结点的元素和模拟的指针指向下一个元素
* 2.结点的结构使用内部类来进行设计
* 3.队列的结构:队列的长度,队列的首节点,队列的尾结点
* 4.考虑队列需要的操作:
* 1.使用构造函数进行初始化
* 2.判断队列是否为空
* 3.返回队列的长度
* 4.向队列尾部中添加元素
* 5.将队列首部元素删除
* 6.格式化输出
* 7.迭代器遍历
* @author WZLOVE
* @create 2018-07-14 18:03
*/
public class LinkedQueue<Item> implements Iterable<Item> { /**
* 定义队列基本元素
*/ /**
* 队列的长度
*/
private int n;
/**
* 队列的首节点
*/
private Node first;
/**
* 队列的尾节点
*/
private Node last; /**
* 定义结点类
*/
private class Node{
private Item item;
private Node next;
} /**
* 使用构造方法初始化队列
* @return
*/
public LinkedQueue() {
this.first = null;
this.last = null;
n = 0;
assert check();
} /**
* 判空
* @return
*/
public boolean isEmpty(){
// 如果对头为null,则表示队列为空
return first == null;
} /**
* 求队列的长度
* @return
*/
public int size(){
return n;
} /**
* 获取对头的元素
* @return
*/
public Item peek(){
if(isEmpty()){
throw new NoSuchElementException("队列为空,没有元素");
}
return first.item;
} /**
* 添加元素
* @return
*/
public void addQueue(Item item){
Node oldNode = last;
last = new Node();
last.item = item;
last.next = null;
if(isEmpty()){
first = last;
} else{
oldNode.next = last;
}
n ++;
assert check();
} /**
* 删除元素
* @return
*/
public Item deQueue(){
if(isEmpty()){
throw new NoSuchElementException("队列为空,不能进行该操作");
}
Item item = first.item;
first = first.next;
n --;
if(isEmpty()){
last = null;
}
assert check();
return item;
} @Override
public String toString() {
StringBuilder sb = new StringBuilder();
for(Item item : this){
sb.append(item + " ");
}
return sb.toString();
} /**
* 返回迭代器
* @return
*/
@Override
public Iterator<Item> iterator() {
return new ListIterator();
} /**
* 实现迭代器接口
*/
private class ListIterator implements Iterator<Item> {
/**
* 队首的元素
*/
private Node current = first; /**
* 判断有无更多元素
* @return
*/
@Override
public boolean hasNext() { return current != null; }
@Override
public void remove() { throw new UnsupportedOperationException(); } /**
* 返回当前元素,移动指针(这样理解就好,实际java中无指针)
* @return
*/
@Override
public Item next() {
if (!hasNext()) throw new NoSuchElementException();
Item item = current.item;
current = current.next;
return item;
}
} /**
*检查队列的结构是否符合要求
* @return
*/
private boolean check() {
if (n < 0) {
return false;
}
else if (n == 0) {
if (first != null) return false;
if (last != null) return false;
}
else if (n == 1) {
if (first == null || last == null) return false;
if (first != last) return false;
if (first.next != null) return false;
}
else {
if (first == null || last == null) return false;
if (first == last) return false;
if (first.next == null) return false;
if (last.next != null) return false; // check internal consistency of instance variable n
int numberOfNodes = 0;
for (Node x = first; x != null && numberOfNodes <= n; x = x.next) {
numberOfNodes++;
}
if (numberOfNodes != n) return false; // check internal consistency of instance variable last
Node lastNode = first;
while (lastNode.next != null) {
lastNode = lastNode.next;
}
if (last != lastNode) return false;
} return true;
} public static void main(String[] args) {
LinkedQueue<String> linkedQueue = new LinkedQueue<>();
linkedQueue.addQueue("迪丽热巴");
linkedQueue.addQueue("杨紫");
linkedQueue.addQueue("李溪芮");
Iterator<String> it = linkedQueue.iterator();
while(it.hasNext()){
System.out.println(it.next());
} System.out.println("============================================================");
System.out.println("队列中有" + linkedQueue.size() + "个元素");
System.out.println("============================================================");
System.out.println(linkedQueue);
}
}

Java之使用链表实现队列的更多相关文章

  1. 教你如何使用Java手写一个基于链表的队列

    在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...

  2. Java数据结构——用双端链表实现队列

    //================================================= // File Name : LinkQueue_demo //---------------- ...

  3. Java并发编程:阻塞队列(转载)

    Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...

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

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

  5. 【Java实现】栈和队列就是这么简单

    一.前言 上一篇已经讲过了链表[Java实现单向链表]了,它跟数组都是线性结构的基础,本文主要讲解线性结构的应用:栈和队列 如果写错的地方希望大家能够多多体谅并指正哦,如果有更好的理解的方式也希望能够 ...

  6. java算法01 - 链表

    1.链表 在Java中实现链表,每个节点都有一个值,然后把它链接到下一个节点.下面来看一下节点的实现 class Node<E> { private E e; private Node&l ...

  7. 【转】Java并发编程:阻塞队列

    在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程 ...

  8. Java并发容器之阻塞队列BlockingQueue

    BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满:从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空. Bloc ...

  9. 12、Java并发编程:阻塞队列

    Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...

随机推荐

  1. 【推荐系统】neural_collaborative_filtering(源码解析)

    很久没看推荐系统相关的论文了,最近发现一篇2017年的论文,感觉不错. 原始论文 https://arxiv.org/pdf/1708.05031.pdf 网上有翻译了 https://www.cnb ...

  2. go 运行项目

    此时运行项目,不能像之前简单的使用go run main.go,因为包main包含main.go和router.go的文件,因此需要运行go run *.go命令编译运行.如果是最终编译二进制项目,则 ...

  3. Centos7 Jenkins

    代码上线 持续集成 随时随地将代码合并,这种方法叫做持续集成. 持续集成(CONTINUOUS INTEGRATION,简称CI)持续集成指的是,频繁地(一天多次)将代码集成到主干.它的好处主要有两个 ...

  4. iOS 开发学习-import和include的区别

    //当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误 //但是使用两次#import的话,不会报错,所以他可以解决重复导入的 ...

  5. WebService有什么用?

    入门之前先简单介绍下WCF.在用WebService做开发时,很多人都不知道WCF和WebService之间的关系.实际上WCF包含了WebService,这是一个很强悍的通信技术应用框架.微软把.N ...

  6. 配置JDBC

    在数据库和MyEclipse都安装好的情况下进行配置: 1.将JDBC(sqljdbc_4.0.2206.100_chs.exe)文件解压到C盘program files下面(也可以将解压后的文件Mi ...

  7. HDU 3853 LOOPS 期望dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3853 LOOPS Time Limit: 15000/5000 MS (Java/Others)Me ...

  8. Do~Hamburger~

    在上一次的结对编程中,我的结对队友是 方俊杰 ,大家都称他为“JJ师兄”. 我们两个彼此在合作中发现错误并在合作中一起进步. First(汉堡上层面包):     JJ他的JAVA功底比我扎实很多,所 ...

  9. Week2-作业1——关于阅读《构建之法》第1、2、16章的疑问与感悟

    关于阅读<构建之法>第1.2.16章的疑问与感悟 术语解释: 第2章,23页 什么是代码覆盖率? ———————————————————— 在测试中的代码覆盖率是指,你运行测试用例后,走过 ...

  10. Week2-作业1-part2.阅读与思考

    第一章.概论 原文: 在成熟的航空工业中,一个飞机发动机从构思到最后运行,不知道经历过多少人.多少工序.多少流程.多少相关知识的验证.我们无法想象,某个商用型号的发动机在飞行时发现问题,最初的设计师会 ...