一、分析

  队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素。允许插入的一端称为队尾,允许删除的一端称为队头。

  链队是指采用链式存储结构实现的队列,它的基本操作如下:

    1、初始化链队

    2、销毁链队

    3、清空链队

    4、检测链队是否为空

    5、返回链队的元素个数

    6、返回链队头元素

    7、向队尾插入元素

    8、删除并返回队头元素

    9、遍历链队

  通常链队用单链表来表示,但一个链队还需要两个分别指示队头和队尾的指针才能唯一确定,和单链表一样,为了便于操作,附设一个头结点来指示队头。

  在Java中,我们可以将链队中的结点视作一个类,类中拥有属性data、nextQueue和lastQueue分别表示数据、下一结点和队尾,链队的基本操作即为类的方法,每个结点就是一个对象。这样,初始化链队就是实例化头结点,销毁链队就是将头结点销毁,链队就会因为缺少引用而被销毁。

二、实现

1、定义类属性和构造函数

 class InitQueue{

     private int [] data = new int[1];     //定义成数组是为了可以用null表示空

     private InitQueue nextQueue;

     private InitQueue lastQueue;

     public InitQueue() {             //头结点的初始化
this.data = null;
this.nextQueue = null;
this.lastQueue = this;
} public InitQueue(int data) {       //普通结点的初始化
this.data[0] = data;
this.nextQueue = null;
this.lastQueue = null;
}
}

2、清空链队

 public void clearQueue() {
this.nextQueue = null;     //头节点的下一结点置空
this.lastQueue = this;     //尾指针指向头结点
}

3、检测链队是否为空

 public boolean queueEmpty() {
if(this.nextQueue == null) {
return true;
}
return false;
}

4、返回链队的元素个数

 public int queueLength() {

     InitQueue theQueue = this.nextQueue;      //获取头结点的下一结点地址(链队的第一个结点)
int i = 0; for (i = 0; theQueue != null; i++) {     //循环读取并计数
theQueue = theQueue.nextQueue;
}
return i;
}

5、返回链队头元素

 public int [] getHead() {
if(this.nextQueue == null) {       //如果链队为空,返回空
return null;
}
return this.nextQueue.data;
}

6、向队尾插入元素

 public void enQueue(int input) {
InitQueue initQueue = new InitQueue(input);     //实例化新结点
this.lastQueue.nextQueue = initQueue;         //插入队尾
this.lastQueue = initQueue;              //尾指针指向队尾
}

7、删除并返回队头元素

 public int [] deQueue() {

     if (this.nextQueue == null) {              //如果链队为空,返回null
return null;
} int [] i = this.nextQueue.data;            //获取队头元素数据
this.nextQueue = this.nextQueue.nextQueue;     //头指针向后移动一位 if (this.nextQueue == null) {             //如果链队变空
this.lastQueue = this;              //尾指针重新指向头结点
}
return i;
}

8、遍历链队

 public String queueTraverse() {          //这里用输出元素值表示遍历

     InitQueue theQueue = this.nextQueue;
String s = ""; while(theQueue != null) {          //循环读取
s += theQueue.data[0] + "、";
theQueue = theQueue.nextQueue;
} if(s.length() == 0) {            //如果未读取到元素值,则返回空字符串
return s;
}
return s.substring(0,s.length() - 1);  //除去最后的顿号后返回
}

三、小结

  以上就是链队用Java的实现,由于只定义了整数的数组,因此只能操作整数数据,但链队的基本思想都已实现。

四、纠正

  隔了一段时间又回来看代码,猛地发现这段代码其实还不够完善。(⊙x⊙;)

  将链队的基本操作定义成了InitQueue类的方法,实例化结点时,会使每个结点都拥有这些方法,然而其实只有头结点需要这些方法,其他结点都不需要。

  因此可以将InitQueue类定义成头节点类,而其他节点定义成头节点的内部类,这样,就只有头节点可以操作其他节点。

  由于要修改的地方太多,这里我就不修改了,放在这里提醒自己。(就是因为懒……(><))

Java实现链队的更多相关文章

  1. Java实现链式存储的二叉查找树(递归方法)

    二叉查找树的定义: 二叉查找树或者是一颗空树,或者是一颗具有以下特性的非空二叉树: 1. 若左子树非空,则左子树上所有节点关键字值均小于根节点的关键字: 2. 若右子树非空,则右子树上所有节点关键字值 ...

  2. Java实现链式存储的二叉树

    二叉树的定义: 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 二叉树的遍历方式主要 ...

  3. java实现链队列

    java实现链队列的类代码: package linkqueue; public class LinkQueue { class Element { Object elem; Element next ...

  4. java实现链式队列

    java实现链式队列...比较简单 package datastruct; public class QueueLink implements Queue { // 定义一个节点内部类 class N ...

  5. JAVA防盗链在报表中的应用实例

    今天我们来聊聊Java防盗链,多说无用,直接上应用案例. 这里所用的工具是报表软件FineReport,搭配有决策系统(一个web前端展示系统,主要用于权限控制),可以采用java防盗链的方式来实现页 ...

  6. java责任链模式及项目实际运用

    1.前言 上次我们认识了java责任链模式的设计,那么接下来将给大家展示责任链模式项目中的实际运用.如何快速搭建责任链模式的项目中运用. 2.简单技术准备 我们要在项目中使用借助这样的几个知识的组合运 ...

  7. java使用链栈实现迷宫求解

    java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html java实现链栈的代码: package stackapplicatio ...

  8. java使用链栈实现数制转换

    java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html 将前面java实现链栈的代码稍作修改: package linkedst ...

  9. C++实现链队类——合肥工业大学数据结构实验5:链式队列

    实验5 5.1 实验目的 熟练掌握队列的顺序链式存储结构. 熟练掌握队列的有关算法设计,并在链队列上实现. 根据具体给定的需求,合理设计并实现相关结构和算法. 5.2 实验要求 5.2.1链队列实验要 ...

随机推荐

  1. Python中的函数递归思想,以及对比迭代和递归解决Fibonacci数列

    什么是递归?简单的说就是:函数自身调用自身. “普通程序员用迭代,天才程序员用递归” 虽然递归 在运行时会不断出栈压栈,调用底层的寄存器,造成空间上的占用以及时间上的缓慢, 但在一些算法上面仍然是递归 ...

  2. 2017 ZSTU寒假排位赛 #6

    题目链接:https://vjudge.net/contest/149212#overview. A题,水题,略过. B题,水题,读清题意即可. C题,数学题,如果把x表示成x=nb+m,则k=n/m ...

  3. CSS-居中方法汇总

    CSS居中是前端工程师经常要面对的问题,也是基本技能之一.今天有时间把CSS居中的方案汇编整理了一下,目前包括水平居中,垂直居中及水平垂直居中方案共15种.如有漏掉的,还会陆续的补充进来. 水平居中 ...

  4. LeetCode 112. 路径总和(Path Sum)

    题目描述 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum ...

  5. Qt DLL总结【二】-创建及调用QT的 DLL

    开发环境:VS2008+Qt4.7.4 最近看了不少Qt的DLL例子,总结一下如何创建和调用QT 动态链接库. 先讲一下对QT动态链接库的调用方法,主要包括: 1.显式链接DLL,调用DLL的全局函数 ...

  6. docker save/load以及export/import使用测试

    对于有些环境需要离线安装的情况,docker以及docker容器都需要能够支持离线安装,对于docker离线安装,比较简单,按照https://www.cnblogs.com/qq931399960/ ...

  7. 如何用MATLAB GUI创建图形用户界面

    MATLAB是众多理工科学生及工程师经常使用的一款数学软件,除了可以实现数据处理,矩阵运算.函数绘制等功能外,MATLAB还可以实现图形用户界面的设计. 下面介绍如何让小白也能用GUI创建最基本的用户 ...

  8. Winform运行外部控制台程序,并在程序结束后执行其他动作

    ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = @"程序名"; psi.Arguments = @&qu ...

  9. 计算机组成原理 — FPGA 现场可编程门阵列

    目录 文章目录 目录 FPGA FPGA 的应用场景 FPGA 的技术难点 FPGA 的工作原理 FPGA 的体系结构 FPGA 的开发 FPGA 的使用 FPGA 的优缺点 参考文档 FPGA FP ...

  10. Hive explode