溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java自定義實現鏈隊列詳解

發布時間:2020-10-01 16:12:19 來源:腳本之家 閱讀:177 作者:HcJsJqJSSM 欄目:編程語言

一、寫在前面

        數據結構中的隊列應該是比較熟悉的了,就是先進先出,因為有序故得名隊列,就如同排隊嘛,在對尾插入新的節點,在對首刪除節點.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自定義實現鏈隊列詳解

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女