兴亡谁人定,胜败岂无凭——易中天《百家讲坛》
不得慕虚名而处实祸 ——曹操

1. 概述

队列是一种线性集合,其元素从一端加入,从另一端删除。因此队列是按照先进先出方式处理的,从队列中删除元素的次序与往队列里放置元素的的次序是一样的。
由于队列是一种线性集合,因此可以像处理栈一样,把队列实现成一种LinearNode对象的链表。

2. 队列ADT

队列核心功能的声明:

package ds.java.ch05.queueImpl;
/** * @author LbZhang* @version 创建时间:2015年11月16日 下午7:06:32 * @description 队列接口*/
public interface QueueADT<T> {public void enqueue(T elem);public T dequeue();public T first();public boolean isEmpty();public int size();public String toString();}

3. 链表实现队列

使用两个分别指向链表受元素、链表末元素的引用方便队列的链表实现。

package ds.java.ch05.queueImpl;
/*** 结点类的声明* @author MrLBZ* @param <T>*/
public class LinearNode<T> {private LinearNode<T> next;private T element;public LinearNode() {next = null;element = null;}public LinearNode(T elem) {next = null;element = elem;}public LinearNode<T> getNext() {return next;}public void setNext(LinearNode<T> node) {next = node;}public T getElement() {return element;}public void setElement(T elem) {element = elem;}
}

package ds.java.ch05.queueImpl;public class EmptyCollectionException extends RuntimeException
{/*** Sets up this exception with an appropriate message.*/public EmptyCollectionException (String collection){super ("The " + collection + " is empty.");}
}

package ds.java.ch05.queueImpl;/*** @author LbZhang* @version 创建时间:2015年11月16日 下午7:30:59* @description 链表实现队列*/
public class LinkedQueue<T> implements QueueADT<T> {private int count;private LinearNode<T> head, tail;// 首尾声明/*** 初始化队列*/public LinkedQueue() {count = 0;head = tail = null;}@Overridepublic void enqueue(T elem) {LinearNode<T> node = new LinearNode<T>(elem);if (isEmpty()) {// /如果是空的话初始化头结点head = node;} else {tail.setNext(node);}tail = node;// /新结点的next不需要显式的设置 因为在new一个新结点的时候已经设置完毕count++;}@Overridepublic T dequeue() throws EmptyCollectionException{if (isEmpty()) {throw new EmptyCollectionException("queue");}T result = head.getElement();head = head.getNext();count--;if (isEmpty()) {tail = null;// /如果栈变成了空栈}return result;}@Overridepublic T first() throws EmptyCollectionException{if (isEmpty())throw new EmptyCollectionException("queue");return head.getElement();}@Overridepublic boolean isEmpty() {return (count == 0);}@Overridepublic int size() {return count;}@Overridepublic String toString() {String result = "";LinearNode<T> current = head;while (current != null) {result = result + (current.getElement()).toString() + "\n";current = current.getNext();}return result;}
}

4. 数组实现队列

把数组看作是环形的,可以除去在队列的数组实现中把元素移位的需要。

package ds.java.ch05.queueImpl;/*** @author LbZhang* @version 创建时间:2015年11月16日 下午10:14:12* @description 环形数组 可以除去在队列的数组实现中元素移位的需要*/
public class CircularArrayQueue<T> implements QueueADT<T> {private final static int DEFAULT_CAPACITY = 100;private int front, rear, count;private T[] queue;// 数组队列public CircularArrayQueue() {this(DEFAULT_CAPACITY);}public CircularArrayQueue(int initc) {front = rear = count = 0;queue = (T[]) (new Object[initc]);}@Overridepublic void enqueue(T elem) {if (size() == queue.length) {expandCapacity();}queue[rear] = elem;rear = (rear + 1) % queue.length;// 设置尾坐标count++;}private void expandCapacity() {// /开辟数组T[] larger = (T[]) (new Object[queue.length * 2]);// 复制数组for (int scan = 0; scan < count; scan++) {larger[scan] = queue[front];// 从front开始复制front = (front + 1) % queue.length;}// /重置首尾结点front = 0;rear = count;queue = larger;}/*** 出队列*/@Overridepublic T dequeue() {if (isEmpty())throw new EmptyCollectionException("queue");T result = queue[front];// 获取front的结点内容queue[front] = null;// 置空front结点front = (front + 1) % queue.length;// front后移count--;return result;}@Overridepublic T first() {if (isEmpty())throw new EmptyCollectionException("queue");T result = queue[front];// 获取front的结点内容return result;}@Overridepublic boolean isEmpty() {return (count == 0);}@Overridepublic int size() {return count;}@Overridepublic String toString() {String result = "";int scan = 0;while (scan < count) {if (queue[scan] != null) {result += queue[scan].toString() + "\n";}scan++;}return result;}}

数据结构(Java)——队列的实现相关推荐

  1. java队列_如何彻底搞懂 Java 数据结构?CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  2. java 头尾 队列_Java数据结构之队列(动力节点Java学院整理)

    队列的定义: 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表. (1)允许删除的一端称为队头(Front). (2)允许插入的一端称为队尾(Rear). (3)当队列中 ...

  3. 银行业务队列简单模拟Java程序设计_PTA 数据结构 银行业务队列简单模拟

    仅供参考,请勿粘贴 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客.给定到达银行的顾客序列,请按业务完 ...

  4. Java队列 Queue

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120828046 本文出自[赵彦军的博客] Java队列 Queue Java队列 ...

  5. Java队列Queue的使用

    首先我们需要知道使用队列是什么,以及使用队列的意义. 一个队列基本上可以认为是一个先入先出(FIFO)的数据结构,队列和数组的主要区别就在于,我们在使用数组时,必须在前面就定义好数组的长度,这就有了很 ...

  6. python顺序表的实现_数据结构:队列 链表,顺序表和循环顺序表实现(python版)...

    链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...

  7. Java数据结构第五版期末考试_数据结构(java)期末复习

    [单选题]多基因遗传病的发病风险与下列哪个因素无关 [单选题]一般手锯的往复长度不应小于锯条长度的( ). [判断题]机器上所有;零件都必须进行机械加工. [单选题]一般划线精度能达到( ). [填空 ...

  8. 数据结构java版本

    文章目录 数据结构java版本 1.Array 2. Stack 3. Queue 4. LinkedList 5. Tree 5.1 树 Tree 5.1.1 二分搜索树 Balanced Bina ...

  9. java 队列和栈区别是什么_队列和栈有什么区别?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Java 把内存划分成两种:一种是栈内存,另一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一 ...

最新文章

  1. Mysql错误问题:ERROR 1005 (HY000): Can't create table 'crm_1.tbl_client' (errno: 150)
  2. oracle 071,Oracle_071_lesson_p3
  3. Python导出Excel图表
  4. 安装DelayExchange插件
  5. 正念奇迹(一则正能量)
  6. SQL核心语句(非常实用的几个技巧)
  7. Java工作笔记-Spring Boot封装Jedis实例
  8. 漫步微积分十七——最大最小值问题(续)
  9. 各机器学习平台视频建模功能汇总
  10. localhost 127.0.0.1 本机IP
  11. C# PGM格式图像与BMP格式图像相互转换
  12. 小程序创业会有哪些坑
  13. MSTSC 自动登录
  14. 为什么设计思维对产品设计有帮助?
  15. PMP有没有必要续证?
  16. 量化交易——布林带策略
  17. 微服务轮子项目(53) -理论小结
  18. 2015年新的开始新的生活
  19. layui动态渲染上传文件功能点击选择文件没反应解决方案
  20. python可以在哪些平台安装_python在不同平台下的安装方法

热门文章

  1. 敏捷测试--测试用例管理平台
  2. kali渗透测试系列---信息收集
  3. Putty保存配置的小技巧
  4. avg是java关键字_浅谈AVG游戏中的脚本
  5. 密室逃脱计算机监控,现在的密室逃脱玩得也太大了吧,如果没有安装监控那还得了...
  6. 机器视觉术语理解(WD,LWD,FOV,光学放大倍率,芯片尺寸、选型公式)(by shany shang)
  7. 4个著名VCS的比较
  8. php 好看的字体设置,适合程序员的字体
  9. 3.有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁。问第4个学生岁数,他说比第3个学生大2岁。以此类推,最后问第1个学生,他说是10岁。请问第5个学生多大。
  10. 关于Authorware的一些吐槽