Java自定义实现链队列详解

作者:HcJsJqJSSM 时间:2023-06-22 12:47:31 

一、写在前面

数据结构中的队列应该是比较熟悉的了,就是先进先出,因为有序故得名队列,就如同排队嘛,在对尾插入新的节点,在对首删除节点.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);
}
}

运行结果:

Java自定义实现链队列详解

来源:http://blog.csdn.net/HcJsJqJSSM/article/details/78503504

标签:Java,链队列
0
投稿

猜你喜欢

  • C# BitArray(点矩阵)转换成int和string的方法实现

    2023-06-18 07:33:44
  • Android实现CoverFlow效果控件的实例代码

    2023-06-23 13:12:43
  • Android中实现根据资源名获取资源ID

    2023-06-20 04:18:30
  • C语言预处理预编译命令及宏定义详解

    2023-06-18 16:28:06
  • Flutter 剪裁组件的使用

    2023-06-18 13:15:04
  • C语言根据协议分割获取字符串单元的实现代码

    2023-06-21 08:20:27
  • flutter material widget组件之信息展示组件使用详解

    2023-06-22 08:45:35
  • Android RecyclerBarChart绘制使用教程

    2023-06-19 12:18:36
  • Winform 实现进度条弹窗和任务控制

    2023-06-20 04:27:09
  • java8新特性之日期时间API

    2023-06-20 09:15:50
  • Flutter 通过Clipper实现各种自定义形状的示例代码

    2023-06-19 14:25:11
  • springsecurity 企业微信登入的实现示例

    2023-06-16 16:39:35
  • android工程下不能运行java main程序的解决方法

    2023-06-23 21:54:08
  • formfile文件上传使用示例

    2023-06-23 03:41:58
  • 探讨:将两个链表非降序合并为一个链表并依然有序的实现方法

    2023-06-23 01:41:38
  • c#处理3种json数据的实例

    2023-06-23 19:12:47
  • 详解C++ STL模拟实现forward_list

    2023-06-21 02:36:04
  • android调试工具DDMS的使用详解

    2023-06-21 09:06:22
  • Flutter开发中的路由参数处理

    2023-06-21 04:27:48
  • Kotlin与Java相互调用的完整实例

    2023-06-17 03:23:23
  • asp之家 软件编程 m.aspxhome.com