java實現(xiàn)隊列數(shù)據(jù)結(jié)構(gòu)代碼詳解
什么是隊列結(jié)構(gòu)
一種線性結(jié)構(gòu),具有特殊的運算法則【只能在一端(隊頭)刪除,在另一端(隊尾)插入】。
分類:
順序隊列結(jié)構(gòu)
鏈式隊列結(jié)構(gòu)
基本操作:
入隊列
出隊列
給出一些應(yīng)用隊列的場景
1):當作業(yè)被送到打印機的時候,就可以按到達的順序排起來,因此每一份作業(yè)是隊列的節(jié)點。
2):售票口的人買票的順序的按照先來先買的順序售票。
3):當所有的終端被占用,由于資源有限,來訪請求需要放在一個隊列中等候。
隊列是先進先出的!
我們設(shè)置一個叫做LinkQueue<T>的泛型集合類,該類里面有 Node 作為內(nèi)部類(作為節(jié)點用),它包含了泛型元素和下一個node節(jié)點的指向next(Node)。
在Linkqueue的里面設(shè)置隊列頭指針 front和隊列尾指針rear,長度size=0;我們先設(shè)置一個構(gòu)造器LinkQueue(),用來初始化這兩個指針節(jié)點,當然,剛開始初始化的時候 這兩個指針僅僅是一個節(jié)點而已,里面的data是空的,我們還讓這兩個指針相等。
//鏈的數(shù)據(jù)結(jié)構(gòu)
private class Node{
public T data;
public Node next;
//無參構(gòu)造函數(shù)
public Node(){}
public Node(T data,Node next){
this.data=data;
this.next=next;
}
}
//隊列頭指針
private Node front;
//隊列尾指針
private Node rear;
public LinkQueue(){
Node n=new Node(null,null);
n.next=null;
front=rear=n;
}
當我們向該隊列添加元素的時候,就會生成一個新的節(jié)點,其data就是你要加的元素,(當添加一個節(jié)點時,該節(jié)點就是隊尾指針指向的最后的節(jié)點,一直排在最后),所以隊尾rear.next=newNode(“新創(chuàng)建的節(jié)點”).這是第一個節(jié)點,也是最后一個節(jié)點,所以front.next=newNode.然后我們再讓rear=newNode(不斷更新)。
public void enqueue(T data){
//創(chuàng)建一個節(jié)點
Node s=new Node(data,null);
//將隊尾指針指向新加入的節(jié)點,將s節(jié)點插入隊尾
rear.next=s;
rear=s;
size++;
}
當隊列出隊的時候,還記得我們有一個Node是front.next=newNode 嗎?這就是第一個節(jié)點。先暫且把它叫做p,所以p.next=第二個節(jié)點,這時我們再把front.next=p.next;這樣頭指針就指向了第二個元素(每一次調(diào)用的時候隊列頭指針指會發(fā)生變化)。
public T dequeue(){
if(rear==front){
try {
throw new Exception("堆棧為空");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}else{
//暫存隊頭元素
Node p=front.next;
T x=p.data;
//將隊頭元素所在節(jié)點摘鏈
front.next=p.next;
//判斷出隊列長度是否為1
if(p.next==null)
rear=front;
//刪除節(jié)點
p=null;
size--;
return x;
}
}
到此為止,隊列的核心操作就完畢了,剩下的比如說size(長度),isEmpty(是否為空),就不在說了。(因為太簡單了!)
具體源碼如下:
public class LinkQueue<T> {
//鏈的數(shù)據(jù)結(jié)構(gòu)
private class Node{
public T data;
public Node next;
//無參構(gòu)造函數(shù)
public Node(){
}
public Node(T data,Node next){
this.data=data;
this.next=next;
}
}
//隊列頭指針
private Node front;
//隊列尾指針
private Node rear;
//隊列長度
private int size=0;
public LinkQueue(){
Node n=new Node(null,null);
n.next=null;
front=rear=n;
}
/**
* 隊列入隊算法
* @param data
* @author WWX
*/
public void enqueue(T data){
//創(chuàng)建一個節(jié)點
Node s=new Node(data,null);
//將隊尾指針指向新加入的節(jié)點,將s節(jié)點插入隊尾
rear.next=s;
rear=s;
size++;
}
/**
* 隊列出隊算法
* @return
* @author WWX
*/
public T dequeue(){
if(rear==front){
try {
throw new Exception("堆棧為空");
}
catch (Exception e) {
e.printStackTrace();
}
return null;
} else{
//暫存隊頭元素
Node p=front.next;
T x=p.data;
//將隊頭元素所在節(jié)點摘鏈
front.next=p.next;
//判斷出隊列長度是否為1
if(p.next==null)
rear=front;
//刪除節(jié)點
p=null;
size--;
return x;
}
}
/**
* 隊列長隊
* @return
* @author WWX
*/
public int size(){
return size;
}
/**
* 判斷隊列是否為空
* @return
* @author WWX
*/
public Boolean isEmpty(){
return size==0;
}
}
另:我曾經(jīng)看過一本JavaScript數(shù)據(jù)結(jié)構(gòu)書,里面講的淺顯易懂,很適合前端搞js開發(fā)的讓人理解的更為深入,在此給予推薦。
《數(shù)據(jù)結(jié)構(gòu)與算法JavaScript描述》
總結(jié)
以上就是本文關(guān)于java實現(xiàn)隊列數(shù)據(jù)結(jié)構(gòu)代碼詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
java編程實現(xiàn)優(yōu)先隊列的二叉堆代碼分享
java編程隊列數(shù)據(jù)結(jié)構(gòu)代碼示例
如有不足之處,歡迎留言指出。
- java實現(xiàn)隊列queue數(shù)據(jù)結(jié)構(gòu)詳解
- Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊列的詳解
- Java隊列數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)
- Java數(shù)據(jù)結(jié)構(gòu)與算法之循環(huán)隊列的實現(xiàn)
- Java數(shù)據(jù)結(jié)構(gòu)與算法之稀疏數(shù)組與隊列深入理解
- java數(shù)據(jù)結(jié)構(gòu)-堆實現(xiàn)優(yōu)先隊列
- Java數(shù)據(jù)結(jié)構(gòu)之鏈表、棧、隊列、樹的實現(xiàn)方法示例
- java編程隊列數(shù)據(jù)結(jié)構(gòu)代碼示例
- Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之隊列
相關(guān)文章
Java中@DateTimeFormat @JsonFormat失效原因及測試填坑
本文主要介紹了Java中@DateTimeFormat @JsonFormat失效原因及測試填坑,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2023-06-06
java?11新特性HttpClient主要組件及發(fā)送請求示例詳解
這篇文章主要為大家介紹了java?11新特性HttpClient主要組件及發(fā)送請求示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
Mybatis-Plus條件構(gòu)造器select方法返回指定字段方式
這篇文章主要介紹了Mybatis-Plus條件構(gòu)造器select方法返回指定字段方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
vscode開發(fā)maven的javaweb項目并部署到tomcat及配置指南
這篇文章主要給大家介紹了關(guān)于vscode開發(fā)maven的javaweb項目并部署到tomcat及配置的相關(guān)資料,在vscode中創(chuàng)建maven項目,需要逐一操作下面的環(huán)節(jié),文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-12-12

