定义

   队列(queue)是一种特殊的线性表,它只允许在表的前端进行删除,在表的后端进行插入。

进行插入端的称为队尾,进行删除端的称为队头。队列是先进先出原则的。队列的实现同样可以

使用两种方式来实现,一种是数的实现方式,另一种是链表的实现方式。

队列的实现

我们已经知道队列已经有两种方式实现,虽然底层的实现方式不同,但是其具有的方法是相同

的,我们采用接口定义其具有的操作。

  1. package com.kiritor;
  2. /**
  3. * 队列FIFO的接口
  4. * @author Kiritor
  5. * */
  6. public interface Queue<T> {
  7. /**
  8. * 入队:从队尾加入一个元素
  9. * @param t
  10. * */
  11. void add(T t);
  12. /**
  13. * 出队:移走队头元素并返回
  14. * @return 当前队头元素*/
  15. T remove();
  16. /**
  17. * 当前队列的元素个数*/
  18. int size();
  19. /**
  20. * 判断当前队列是否为空
  21. * @return */
  22. boolean isEmpty();
  23. /**
  24. * 只是返回队头元素,并未删掉
  25. * @return t*/
  26. T front();
  27. }

队列的数组实现

  1. package com.kiritor;
  2. import java.util.Arrays;
  3. /**
  4. * 基于数组实现的队列
  5. * @author Kiritor*/
  6. public class ArrayQueue<T> implements Queue<T>{
  7. private T[] data;
  8. private int size;//元素个数
  9. private int front;//队列中第一个对象的位置
  10. private int rear;//队列中当前对象的位置
  11. public ArrayQueue() {
  12. data = (T[]) new Object[10];
  13. size = 0;
  14. front =0;
  15. rear = 0;
  16. }
  17. @Override
  18. public void add(T t) {
  19. if(isFull())
  20. {
  21. resize();
  22. front = 0;
  23. }
  24. rear = (front+size)%data.length;
  25. System.out.println(rear);
  26. data[rear] = t;
  27. size++;
  28. }
  29. @Override
  30. public T remove() {
  31. if (isEmpty()) {
  32. throw new RuntimeException("队列为空!");
  33. }
  34. T tempData = data[front];
  35. data[front] = null;
  36. //思考一下这里有必要进行除法运算吗?
  37. front = (front + 1) % (data.length);
  38. size--;
  39. return tempData;
  40. }
  41. @Override
  42. public int size() {
  43. return size;
  44. }
  45. @Override
  46. public boolean isEmpty() {
  47. return size == 0;
  48. }
  49. @Override
  50. public T front() {
  51. if (isEmpty()) {
  52. throw new RuntimeException("队列为空!");
  53. }
  54. return data[front];
  55. }
  56. /**
  57. * 判断当前队列是否已满
  58. * @return*/
  59. public boolean isFull()
  60. {
  61. return size == data.length;
  62. }
  63. /**
  64. * 扩容,2倍
  65. * */
  66. public void resize()
  67. {
  68. /*注意重新扩容的时候并不需要去设置size
  69. * 队列的大小并不能通过数组的大小直观的显示出来。
  70. * 但是栈就可以直观的通过数组的大小显示出来*/
  71. T[] tmp = (T[]) new Object[data.length*2];
  72. System.arraycopy(data, 0, tmp, 0, data.length);
  73. data = tmp;
  74. tmp = null;//引用置为空,便于gc处理
  75. }
  76. public static void main(String[] args) {
  77. ArrayQueue<String> q = new ArrayQueue<String>();
  78. q.add("a");
  79. q.add("b");
  80. q.add("c");
  81. q.add("d");
  82. q.add("e");
  83. q.add("f");
  84. q.add("g");
  85. q.add("h");
  86. q.add("i");
  87. q.add("j");
  88. q.add("k");
  89. q.add("l");
  90. q.add("m");
  91. while( !q.isEmpty() ){
  92. String temp = q.remove();
  93. System.out.println(temp);
  94. }
  95. }
  96. }

队列的链表实现

  1. package com.kiritor;
  2. /**
  3. * 队列的链表实现
  4. * @author Kiritor
  5. * @param <T>*/
  6. public class LinkQueue<T> implements Queue<T> {
  7. private Node head;
  8. private Node rear;
  9. private int size;
  10. public LinkQueue() {
  11. head = null;
  12. rear = null;
  13. size = 0;
  14. }
  15. class Node
  16. {
  17. T data;
  18. Node next;
  19. public Node() {
  20. //无参构造
  21. }
  22. public Node(T t)
  23. {
  24. this.data = t;
  25. }
  26. }
  27. /**
  28. * 从队列的尾部插入结点*/
  29. @Override
  30. public void add(T t) {
  31. Node node = new Node(t);
  32. /*如果是队列则头部和尾部都执行Node*/
  33. if(isEmpty())
  34. head = node;
  35. else
  36. rear.next = node;
  37. rear = node;
  38. size++;//队列长度+1
  39. }
  40. /**
  41. * 从队列的头部删除
  42. * @return T*/
  43. @Override
  44. public T remove() {
  45. T  tmp;
  46. if(isEmpty()){
  47. new NullPointerException("队列是空的!");
  48. tmp = null;
  49. }
  50. else
  51. {
  52. if(null==head.next )
  53. rear = null;
  54. tmp = head.data;
  55. head = head.next;
  56. size--;
  57. }
  58. return tmp;
  59. }
  60. @Override
  61. public int size() {
  62. return size;
  63. }
  64. @Override
  65. public boolean isEmpty() {
  66. return head == null;
  67. }
  68. /**
  69. * 查看队列头部,不做任何处理*/
  70. @Override
  71. public T front() {
  72. if(head !=null)
  73. return head.data;
  74. return null;
  75. }
  76. public static void main(String[] args) {
  77. LinkQueue<String> q = new LinkQueue<String>();
  78. q.add("a");
  79. q.add("b");
  80. q.add("c");
  81. q.add("d");
  82. q.add("e");
  83. q.add("f");
  84. q.add("g");
  85. q.add("h");
  86. q.add("i");
  87. q.add("j");
  88. q.add("k");
  89. q.add("l");
  90. q.add("m");
  91. System.out.println(q.size);
  92. while( !q.isEmpty() ){
  93. String temp = q.remove();
  94. System.out.println(temp);
  95. System.out.println(q.size());
  96. }
  97. }
  98. }

看下链队列的演示操作吧

队列的实现(JAVA)的更多相关文章

  1. 【阿里云产品公测】消息队列服务MQS java SDK 机器人应用初体验

    [阿里云产品公测]消息队列服务MQS java SDK 机器人应用初体验 作者:阿里云用户啊里新人   初体验 之 测评环境 由于MQS支持外网访问,因此我在本地做了一些简单测试(可能有些业余),之后 ...

  2. 两个栈实现队列+两个队列实现栈----java

                                               两个栈实现队列+两个队列实现栈----java 一.两个栈实现一个队列 思路:所有元素进stack1,然后所有出s ...

  3. HashMap的原理与实 无锁队列的实现Java HashMap的死循环 red black tree

    http://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html https://zh.wikipedia.org/wiki/%E7%BA ...

  4. java 栈和队列的模拟--java

    栈的定义:栈是一种特殊的表这种表只在表头进行插入和删除操作.因此,表头对于栈来说具有特殊的意义,称为栈顶.相应地,表尾称为栈底.不含任何元素的栈称为空栈. 栈的逻辑结构:假设一个栈S中的元素为an,a ...

  5. 数据结构-队列(3)-使用Java内置队列

    大多数流行语言都提供内置的队列库,因此您无需重新发明轮子. 如前所述,队列有两个重要的操作,入队 enqueue 和出队 dequeue. 此外,我们应该能够获得队列中的第一个元素,因为应该首先处理它 ...

  6. 队列的实现——java

    同样实现方法有两种: 1. 数组的实现,可以存储任意类型的数据(略): 2. Java的 Collection集合 中自带的"队列"(LinkedList)的示例: import ...

  7. 算法笔记_080:蓝桥杯练习 队列操作(Java)

    目录 1 问题描述 2 解决方案 1 问题描述 问题描述 队列操作题.根据输入的操作命令,操作队列(1)入队.(2)出队并输出.(3)计算队中元素个数并输出. 输入格式 第一行一个数字N. 下面N行, ...

  8. LeetCode--255--用队列实现栈(java版)

    使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 注意: 你只能使用队列的基本操作 ...

  9. AQS源码深入分析之条件队列-你知道Java中的阻塞队列是如何实现的吗?

    本文基于JDK-8u261源码分析 1 简介 因为CLH队列中的线程,什么线程获取到锁,什么线程进入队列排队,什么线程释放锁,这些都是不受我们控制的.所以条件队列的出现为我们提供了主动式地.只有满足指 ...

随机推荐

  1. java内存分块

     运行时数据区域 Java虚拟机在执行Java的过程中会把管理的内存划分为若干个不同的数据区域.这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,而有的区域则依赖线程的启 ...

  2. c语言学习之基础知识点介绍(十一):字符串的介绍、使用

    本节主要介绍c语言中的字符串的应用. 一:字符串介绍 因为c语言中没有像Java.C#那样的字符串类型,所以无法直接用字符串.需要借助数组来解决这个问题. /* 定义:把多个字符连在一起就叫字符串.但 ...

  3. win向linux传文件

    使用pscp.exe即可. 下载pscp.exe(http://pan.baidu.com/s/1jG6zmx4) 复制到windows/system32目录下即可. 然后可在cmd命令行下使用psc ...

  4. 三、使用Maven构建简单的java项目

    前边,我刚搭建了Maven环境,还有给大家推荐了学习资源,这个小节,我们来就来,,简单的玩玩maven. 1.所需工具: 1.Eclipse     2.apache-maven-3.3.9   3. ...

  5. requirejs实践二 加载其它JavaScript与运行

    上一篇中介绍了requirejs加载JavaScript文件,在这一篇中介绍加载JavaScript后执行代码 这次是test2.html文件, <!DOCTYPE html> <h ...

  6. Core Canvas–Day1

    绘制 1.坐标系统: canvas的坐标以左上角为原点,如图 可对canvas的坐标系统进行变换,变换的方式有 平移translate 旋转rotate 缩放scale 创建自定义的变换方式,切变 2 ...

  7. Java中多线程的使用!!

    简介:       1.要了解多线程,首先我们得先了解进程和线程.那么什么是进程?进程就是一个正在运行的程序分配内存让应用程序能够运行的叫做进程.那么什么又是线程呢?线程:在一个程序中,负责代码的执行 ...

  8. OpenCV(7)-图像直方图

    直方图定义可参考这里.图像的直方图用来表示图像像素的统计信息,它统计了图像每一个通道(如果是多通道)中,每个像素的个数(比例). 计算直方图 OpenCV提供了直接计算直方图的函数 void calc ...

  9. Js获取fileupload的绝对路径时总是的到C:\fakepath\+文件名称的 解决方案

    解决方法: Internet选项->安全->自定义级别->将文件下载到服务器时包含本地目录路径  启用就可以了.

  10. 简易ORM(基于注解)

    这是从我们现有项目做的一定的改进准备做成IDE插件 类似getter和setter的生成 1.定义实体类 通过注解说明其表名和字段名(SOURCE类型的注解 不需要运行时使用)@TableName(& ...