Java自定义实现链队列详解

 更新时间:2017年12月06日 08:41:50   作者:HcJsJqJSSM  
这篇文章主要为大家详细介绍了Java自定义实现链队列的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、写在前面

        数据结构中的队列应该是比较熟悉的了,就是先进先出,因为有序故得名队列,就如同排队嘛,在对尾插入新的节点,在对首删除节点.jdk集合框架也是提供也一个Queue的接口.这个接口代表一个队列.顺序队列:ArrayBlockingQueue,LinkedBlockingQueue.(上面两种是足色队列)还有一种是ConcurentLinkedQueue。
底层的实现由数组合链表两种的,数组的实现会有个弊端的,会造成假满的现象,开始的时候,队列为空的时候,对首引用变量个对尾的引用变量都为null,随着删除队列的元素,就会发生front+1,rear等于底层数组的容量了.在顺序的存储结构中,front总是保存这着队列中即将出队列的元素的索引,rear总是保存着即将进入队列的元素的索引.队列中的元素的个数就是rear-front的.在顺序的队列中,底层是数组,所以保存 的数据元素是不会改变的,改变的只有rear和front这两个引用变量.
        这里采用链式存储可以有效的利用空间的,就是引用变量要占用额外的空间的.

队列的常用的操作:

             1:初始化
             2:返回队列的长度
             3:添加元素
             4:删除元素
             5:访问对首的元素
             6:访问队列的对尾的元素
             7:判断队列是否为空
             8:清空队列

二、自定义的实现

源码展示的比较清楚,就不用再多做介绍

public class LinkedQueue<T>{
//自定义链队列--采用非静态内部类来表示链队列的数据节点
private class Node{
//表示链队列的数据节点 
private T data;
//指向下一个节点的引用
private Node next;
 @SuppressWarnings("unused")
 public Node(){
 
}
public Node(T data,Node next){
 this.data=data;
 this.next=next;
 }
}
//定义链队列的对首和对尾的引用
 private Node front;
 private Node rear;
 //定义链栈的大小
private int size;
 //创建一个空的链对列
public LinkedQueue(){
 front=null;
 rear=null;
}
//以确定的元素来创建一个链对列,只有一个节点的
public LinkedQueue(T element){
front=new Node(element,null);
//指向同一个元素
rear=front;
size++;
}
//返回链队列的大小
public int length(){
return size;
}
//返回链队列得对首的元素,不删除对首的元素
public T elementFront(){
if(!empty()){
 return front.data;
}else{
 return null; 
 
}
}
//访问队列的最后一个元素
public T elementRear(){
if(!empty()){
 return rear.data;
 
}else{
 return null; 
} 
}
//返回当前的链对队列是否为空
public boolean empty(){
 return size==0;
 }
//清空一个链队列
public void clear(){
 front=null;
 rear=null;
 size=0;
}
//插入链队列一个节点--对尾
public void add(T element){
 //如果链对列为空,就新建一个节点
 if(front==null){
 rear=new Node(element,null);
 front=rear;
 }else{
 //动态创建新节点
 Node newRear=new Node(element,null);
 rear.next=newRear;
 rear=newRear; 
}
size++;
}
//删除链队列一个节点,返回删除后的节点
public T remove(){
   Node oldFront=front;
   front=front.next;
   oldFront.next=null;
   size--;
   return oldFront.data;
}
//返回队列
public String toString(){
 //如果链队列为空链队列是
 if(empty()){
 return "[]";
 }else{
 StringBuilder sBuilder=new StringBuilder("[");
 for(Node current=front;current!=null;current=current.next){
 sBuilder.append(current.data.toString()+",");
}
 int len=sBuilder.length();
return sBuilder.delete(len-1, len).append("]").toString();
}
}
public static void main(String[] args) {
 LinkedQueue<String> lQueue=new LinkedQueue<String>();
 lQueue.add("aaa");
 lQueue.add("bbb");
 lQueue.add("ccc");
 lQueue.add("ddd");
System.out.println("返回队列的头结点的数值:"+lQueue.elementFront());
System.out.println("返回队列的尾节点的数值:"+lQueue.elementRear());
System.out.println(lQueue.length());
System.out.println(lQueue);
}
}  

运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • IDEA如何解决代码没有提示问题

    IDEA如何解决代码没有提示问题

    文章介绍了如何解决IDEA中代码提示功能缺失的问题,首先,需要调整快捷键设置,将CyclicExpandWord键映射为Ctrl+/,其次,确保输入框中设置为Basic,然后添加键盘快捷键Alt+/,如果问题依然存在,可能是由于电脑省电模式导致的,需要取消相关设置
    2024-11-11
  • 详解如何在SpringBoot中优雅地重试调用第三方API

    详解如何在SpringBoot中优雅地重试调用第三方API

    作为后端程序员,我们的日常工作就是调用一些第三方服务,将数据存入数据库,返回信息给前端。本文为大家介绍了如何在SpringBoot中优雅地重试调用第三方API,需要的可以参考一下
    2022-12-12
  • Java正则替换手机号代码实例

    Java正则替换手机号代码实例

    本文的主要内容是Java语言中正则表达式替换手机号的第4到第7位,实现方法十分简单,同时涉及了一些正则表达式的相关用法,需要的朋友可以参考下。
    2017-09-09
  • java中优化大量if...else...方法总结

    java中优化大量if...else...方法总结

    在我们平时的开发过程中,经常可能会出现大量If else的场景,代码显的很臃肿,非常不优雅,下面这篇文章主要给大家介绍了关于java中优化大量if...else...方法的相关资料,需要的朋友可以参考下
    2023-03-03
  • Java 深入探究讲解简单工厂模式

    Java 深入探究讲解简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现
    2022-04-04
  • Java利用EasyExcel实现导出导入功能的示例代码

    Java利用EasyExcel实现导出导入功能的示例代码

    EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。本文废话不多说,直接上手试试,用代码试试EasyExcel是否真的那么好用
    2022-11-11
  • mybatis之批量添加问题

    mybatis之批量添加问题

    这篇文章主要介绍了mybatis之批量添加问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • idea中service或者mapper引入报红的问题及解决

    idea中service或者mapper引入报红的问题及解决

    在使用IntelliJ IDEA开发SpringBoot项目时,有时会遇到Service或Mapper接口引入时报红但不影响项目运行的情况,这主要是因为IDEA的检查级别设置问题,解决方法是将有问题的Error级别改为编译通过的安全级别,即可消除报红
    2024-09-09
  • Spring Boot文件上传最新解决方案

    Spring Boot文件上传最新解决方案

    本文给大家分享Spring Boot文件上传功能的示例代码,包括单文件上传示例和多文件上传,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-07-07
  • Map按单个或多个Value排序当Value相同时按Key排序

    Map按单个或多个Value排序当Value相同时按Key排序

    Map可以先按照value进行排序,然后按照key进行排序。 或者先按照key进行排序,然后按照value进行排序,这样操作都行,这篇文章主要介绍了Map按单个或多个Value排序,当Value相同时按Key排序,需要的朋友可以参考下
    2023-02-02

最新评论