Java實現隊列結構(數據結構)


先給出一些應用隊列的場景

  1):當作業被送到打印機的時候,就可以按到達的順序排起來,因此每一份作業是隊列的節點。

  2):售票口的人買票的順序的按照先來先買的順序售票。

  3):當所有的終端被占用,由於資源有限,來訪請求需要放在一個隊列中等候。

隊列是先進先出的!

  我們設置一個叫做LinkQueue<T>的泛型集合類,該類里面有 Node 作為內部類(作為節點用),它包含了泛型元素和下一個node節點的指向next(Node)。

在Linkqueue的里面設置隊列頭指針 front和隊列尾指針rear,長度size=0;我們先設置一個構造器LinkQueue(),用來初始化這兩個指針節點,當然,剛開始初始化的

時候 這兩個指針僅僅是一個節點而已,里面的data是空的,我們還讓這兩個指針相等。

 

 1  //鏈的數據結構  
 2     private class Node{  
 3         public  T data;  
 4         public  Node next;  
 5         //無參構造函數  
 6         public Node(){}  
 7           
 8         public Node(T data,Node next){  
 9             this.data=data;  
10             this.next=next;  
11         }  
12     }  
13     //隊列頭指針  
14     private Node front;  
15     //隊列尾指針  
16     private Node rear;

 

 

 

  

1 public LinkQueue(){  
2         Node n=new Node(null,null);  
3         n.next=null;  
4         front=rear=n;  
5     }  

 

 

 

  當我們向該隊列添加元素的時候,就會生成一個新的節點,其data就是你要加的元素,(當添加一個節點時,該節點就是隊尾指針指向的最后的節點,一直排在最后),所以

隊尾rear.next=newNode(“新創建的節點”).這是第一個節點,也是最后一個節點,所以front.next=newNode.然后我們再讓rear=newNode(不斷更新)。

  

1  public void enqueue(T data){  
2         //創建一個節點  
3         Node s=new Node(data,null);  
4         //將隊尾指針指向新加入的節點,將s節點插入隊尾  
5         rear.next=s;  
6         rear=s;  
7         size++;  
8     }  

 

  當隊列出隊的時候,還記得我們有一個Node是front.next=newNode 嗎?這就是第一個節點。先暫且把它叫做p,所以p.next=第二個節點,這時我們再把front.next=p.next;這樣頭指針就指向了第二個元素(每一次調用的時候隊列頭指針指會發生變化)。

 1 public  T dequeue(){  
 2         if(rear==front){  
 3             try {  
 4                 throw new Exception("堆棧為空");  
 5             } catch (Exception e) {  
 6                 e.printStackTrace();  
 7             }  
 8             return null;  
 9         }else{  
10             //暫存隊頭元素  
11             Node p=front.next;  
12             T x=p.data;  
13             //將隊頭元素所在節點摘鏈  
14             front.next=p.next;  
15             //判斷出隊列長度是否為1  
16             if(p.next==null)  
17                 rear=front;  
18             //刪除節點  
19             p=null;  
20             size--;  
21             return  x;  
22         }  
23     }  

到此為止,隊列的核心操作就完畢了,剩下的比如說size(長度),isEmpty(是否為空),就不在說了。(因為太簡單了!)

具體源碼如下:

 1 public class LinkQueue<T> {  
 2       
 3     //鏈的數據結構  
 4     private class Node{  
 5         public  T data;  
 6         public  Node next;  
 7         //無參構造函數  
 8         public Node(){}  
 9           
10         public Node(T data,Node next){  
11             this.data=data;  
12             this.next=next;  
13         }  
14     }  
15     //隊列頭指針  
16     private Node front;  
17     //隊列尾指針  
18     private Node rear;  
19     //隊列長度  
20     private int size=0;  
21       
22     public LinkQueue(){  
23         Node n=new Node(null,null);  
24         n.next=null;  
25         front=rear=n;  
26     }  
27       
28     /** 
29      * 隊列入隊算法 
30      * @param data 
31      * @author WWX 
32      */  
33     public void enqueue(T data){  
34         //創建一個節點  
35         Node s=new Node(data,null);  
36         //將隊尾指針指向新加入的節點,將s節點插入隊尾  
37         rear.next=s;  
38         rear=s;  
39         size++;  
40     }  
41       
42     /** 
43      * 隊列出隊算法 
44      * @return 
45      * @author WWX 
46      */  
47     public  T dequeue(){  
48         if(rear==front){  
49             try {  
50                 throw new Exception("堆棧為空");  
51             } catch (Exception e) {  
52                 e.printStackTrace();  
53             }  
54             return null;  
55         }else{  
56             //暫存隊頭元素  
57             Node p=front.next;  
58             T x=p.data;  
59             //將隊頭元素所在節點摘鏈  
60             front.next=p.next;  
61             //判斷出隊列長度是否為1  
62             if(p.next==null)  
63                 rear=front;  
64             //刪除節點  
65             p=null;  
66             size--;  
67             return  x;  
68         }  
69     }  
70       
71     /** 
72      * 隊列長隊 
73      * @return 
74      * @author WWX 
75      */  
76     public int size(){  
77         return size;  
78     }  
79       
80     /** 
81      * 判斷隊列是否為空 
82      * @return 
83      * @author WWX 
84      */  
85     public  boolean isEmpty(){  
86         return  size==0;  
87           
88     }  
89       
90       }
View Code

 另:我曾經看過一本JavaScript數據結構書,里面講的淺顯易懂,很適合前端搞js開發的讓人理解的更為深入,在此給予推薦。<<數據結構與算法JavaScript描述>>

 

>>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM