溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java中如何實(shí)現(xiàn)隊(duì)列數(shù)組和鏈表

發(fā)布時(shí)間:2020-06-23 11:00:12 來源:億速云 閱讀:162 作者:Leah 欄目:編程語言

這篇文章將為大家詳細(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è)資訊,感謝各位的閱讀。

向AI問一下細(xì)節(jié)

免責(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)容。

AI