【數據結構和算法】java 隊列實現

在上一篇博文中通過java實現了隊列的連續存儲,下面來討論隊列的鏈式存儲,即鏈隊列。

鏈隊列的定義:

隊列的鏈式存儲結構簡稱爲鏈隊列。它是限制僅在表頭刪除和表尾插入的單鏈表。

鏈隊列的數據存儲形式:

 鏈隊列基本運算的實現:

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. package study_02.datastructure.queue;  
  2.   
  3.   
  4. /** 
  5.  * 鏈隊列 
  6.  * @author WWX 
  7.  */  
  8. public class LinkQueue<T> {  
  9.       
  10.     //鏈的數據結構  
  11.     private class Node{  
  12.         public  T data;  
  13.         public  Node next;  
  14.         //無參構造函數  
  15.         public Node(){}  
  16.           
  17.         public Node(T data,Node next){  
  18.             this.data=data;  
  19.             this.next=next;  
  20.         }  
  21.     }  
  22.     //隊列頭指針  
  23.     private Node front;  
  24.     //隊列尾指針  
  25.     private Node rear;  
  26.     //隊列長度  
  27.     private int size=0;  
  28.       
  29.     public LinkQueue(){  
  30.         Node n=new Node(null,null);  
  31.         n.next=null;  
  32.         front=rear=n;  
  33.     }  
  34.       
  35.     /** 
  36.      * 隊列入隊算法 
  37.      * @param data 
  38.      * @author WWX 
  39.      */  
  40.     public void enqueue(T data){  
  41.         //創建一個節點  
  42.         Node s=new Node(data,null);  
  43.         //將隊尾指針指向新加入的節點,將s節點插入隊尾  
  44.         rear.next=s;  
  45.         rear=s;  
  46.         size++;  
  47.     }  
  48.       
  49.     /** 
  50.      * 隊列出隊算法 
  51.      * @return 
  52.      * @author WWX 
  53.      */  
  54.     public  T dequeue(){  
  55.         if(rear==front){  
  56.             try {  
  57.                 throw new Exception("堆棧爲空");  
  58.             } catch (Exception e) {  
  59.                 e.printStackTrace();  
  60.             }  
  61.             return null;  
  62.         }else{  
  63.             //暫存隊頭元素  
  64.             Node p=front.next;  
  65.             T x=p.data;  
  66.             //將隊頭元素所在節點摘鏈  
  67.             front.next=p.next;  
  68.             //判斷出隊列長度是否爲1  
  69.             if(p.next==null)  
  70.                 rear=front;  
  71.             //刪除節點  
  72.             p=null;  
  73.             size--;  
  74.             return  x;  
  75.         }  
  76.     }  
  77.       
  78.     /** 
  79.      * 隊列長隊 
  80.      * @return 
  81.      * @author WWX 
  82.      */  
  83.     public int size(){  
  84.         return size;  
  85.     }  
  86.       
  87.     /** 
  88.      * 判斷隊列是否爲空 
  89.      * @return 
  90.      * @author WWX 
  91.      */  
  92.     public  boolean isEmpty(){  
  93.         return  size==0;  
  94.           
  95.     }  
  96.       
  97.       
  98.     public String toString() {  
  99.         if(isEmpty()){  
  100.             return "[]";  
  101.         }else{  
  102.             StringBuilder sb = new StringBuilder("[");  
  103.             for(Node current=front.next;current!=null;current=current.next){  
  104.                 sb.append(current.data.toString() + ", ");  
  105.             }  
  106.             int len = sb.length();  
  107.             return sb.delete(len - 2, len).append("]").toString();  
  108.         }  
  109.     }  
  110.       
  111.     //測試  
  112.     public static void main(String[] args) {  
  113.         LinkQueue<Integer> queue=new LinkQueue<Integer>();  
  114.         queue.enqueue(1);  
  115.         queue.enqueue(2);  
  116.         queue.enqueue(3);  
  117.         queue.enqueue(4);  
  118.         queue.enqueue(5);  
  119.         queue.enqueue(6);  
  120.         System.out.println(queue);  
  121.         System.out.println("出隊:"+queue.dequeue());  
  122.         System.out.println("隊列長度="+queue.size());  
  123.         System.out.println(queue);  
  124.         System.out.println("出隊:"+queue.dequeue());  
  125.         System.out.println("隊列長度="+queue.size());  
  126.         System.out.println(queue);  
  127.         System.out.println("出隊:"+queue.dequeue());  
  128.         System.out.println("隊列長度="+queue.size());  
  129.         System.out.println(queue);  
  130.     }  
  131. }  

 

輸出結果:

[1, 2, 3, 4, 5, 6]
出隊:1
隊列長度=5
[2, 3, 4, 5, 6]
出隊:2
隊列長度=4
[3, 4, 5, 6]
出隊:3
隊列長度=3
[4, 5, 6]

原文地址:http://blog.csdn.net/sky_zhangfan/article/details/3959847

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章