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描述>>

 

>>

原文地址:https://www.cnblogs.com/coversky/p/6350086.html