您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)java中如何實(shí)現(xiàn)隊(duì)列數(shù)組和鏈表,文章內(nèi)容質(zhì)量較高,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
隊(duì)列的介紹
隊(duì)列是一種先進(jìn)先出(FIFO)的線性的數(shù)據(jù)結(jié)構(gòu),隊(duì)列的主要操作為入隊(duì)和出隊(duì)。
隊(duì)頭:隊(duì)列的出口端,隊(duì)尾:隊(duì)列的入口端,通常在數(shù)組中表示為最后入隊(duì)元素的下一個(gè)位置。
在用數(shù)組實(shí)現(xiàn)時(shí),注意:若隊(duì)頭不斷有元素出隊(duì),那么隊(duì)列的可用空間就會(huì)變小,所以我們通常用循環(huán)隊(duì)列來實(shí)現(xiàn),此時(shí)隊(duì)尾也可能出現(xiàn)在隊(duì)頭的前面。
隊(duì)列的數(shù)組實(shí)現(xiàn)
隊(duì)列的數(shù)組實(shí)現(xiàn)這里的隊(duì)列一般都是循環(huán)隊(duì)列!
特別注意:
(1)隊(duì)列滿時(shí)的判斷條件為(隊(duì)尾下標(biāo)+1) % 數(shù)組長度 = 隊(duì)頭下標(biāo)
(2)隊(duì)尾指針指向的位置空出一位,因此隊(duì)列最大容量比數(shù)組長度小1。
public class MyQueue { private int[] array; private int front; private int rear; public MyQueue(int capacity){ array = new int[capacity]; } /* 入隊(duì)時(shí),只需判斷隊(duì)列是否已滿,若隊(duì)列已滿,則拋出異常,其他情況(包括隊(duì)列為空)都正常插入 */ public void enQueue(int data) throws Exception{ if((rear+1) % array.length == front) throw new Exception("隊(duì)列已滿,不能入隊(duì)!"); array[rear] = data; rear = (rear+1) % array.length; } /* 出隊(duì)時(shí),判斷隊(duì)列是否為空,若隊(duì)列為空,拋出異常 */ public int deQueue() throws Exception{ if(front == rear) throw new Exception("隊(duì)列為空,不能出隊(duì)!"); int temp = array[front]; front = (front+1) % array.length; return temp; } // public void output(){ // for(int i = front; ((i+1) % array.length) <= rear; i++){ //一直在循環(huán)輸出,嚴(yán)重錯(cuò)誤!不能把取模判斷語句寫在條件里面! // i %= array.length; // System.out.println(array[i]); // } // } public void output(){ for(int i = front; i != rear; i = (i+1) % array.length){ System.out.println(array[i]); } } public static void main(String[] args) throws Exception{ MyQueue myQueue = new MyQueue(5);//長度為5的隊(duì)列只能插入4個(gè)元素 myQueue.enQueue(1); myQueue.enQueue(3); myQueue.enQueue(2); myQueue.enQueue(4); myQueue.deQueue(); myQueue.deQueue(); myQueue.enQueue(5); myQueue.enQueue(6); myQueue.output(); } }
隊(duì)列的鏈表實(shí)現(xiàn)
隊(duì)列用鏈表實(shí)現(xiàn)時(shí),用頭指針指向隊(duì)列的第一個(gè)節(jié)點(diǎn),用尾指針指向隊(duì)列的最后一個(gè)節(jié)點(diǎn)。
public class MyQueue_LinkList { private static class Node{ int data; Node next; Node(int data){ this.data = data; } } private Node front; private Node rear; private int size;//隊(duì)列中實(shí)際元素的個(gè)數(shù) private int maxsize; public MyQueue_LinkList(int capacity){ maxsize = capacity; } public void enQueue(int data) throws Exception{ if(size >= maxsize) throw new Exception("隊(duì)列已滿,無法入隊(duì)"); Node insertedNode = new Node(data); if(size == 0){ front = insertedNode; rear = insertedNode; } else{ rear.next = insertedNode; rear = insertedNode; } size++; } public int deQueue() throws Exception{ if(front == null) throw new Exception("隊(duì)列為空,無法出隊(duì)!"); int temp; if(front == rear)//隊(duì)列中只有一個(gè)節(jié)點(diǎn) rear = null; temp = front.data; front = front.next; size--; return temp; } public void output(){ Node temp = front; for(int i = 0 ; i < size; i++){ System.out.println(temp.data); temp = temp.next; } } public static void main(String[] args) throws Exception{ MyQueue_LinkList myQueue_linkList = new MyQueue_LinkList(5); myQueue_linkList.enQueue(1); myQueue_linkList.enQueue(3); myQueue_linkList.enQueue(2); myQueue_linkList.deQueue(); myQueue_linkList.deQueue(); myQueue_linkList.enQueue(5); myQueue_linkList.enQueue(7); myQueue_linkList.output(); } }
隊(duì)列的應(yīng)用場景
(1)銀行排隊(duì),先來先服務(wù)。
(2)多線程中,爭奪公平鎖的等待隊(duì)列,就是按照訪問順序來決定線程在隊(duì)列中的次序的。
(3)網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)網(wǎng)站抓取,就是把待抓取的網(wǎng)站URL存入隊(duì)列中,再按照存入隊(duì)列的順序來依次抓取和解析。
以上就是java中實(shí)現(xiàn)隊(duì)列數(shù)組和鏈表的方法,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊,感謝各位的閱讀。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。