1. 程式人生 > >java佇列的連結串列實現

java佇列的連結串列實現

原始碼的github地址,可以下載到本地執行

package Interface;

/**
 * 佇列介面
 * <p>
 * 佇列是一種先進先出的線性表
 * 只能在表的一端進行插入,另一段進行刪除
 * 允許插入的一端叫隊尾,允許刪除的一端叫隊頭()
 *
 *
 * ps:還存在一種 雙端佇列 即隊頭和隊尾都可以進行插入和刪除的操作,隊頭和隊尾在這裡叫端點
 * 以及輸入受限的雙端佇列(一端輸入和刪除,另一端只能刪除)
 * 輸出受限的雙端佇列(一端輸入和刪除,另一端只能輸入)
 * 但是雙端佇列應用不廣泛 不在此做討論
 */
public interface IQueue<T> {

    /**
     * 初始化佇列 構造一個空佇列
     */
    IQueue InitQueue();

    /**
     * 銷燬佇列
     */
    IQueue DestroyQueue();

    /**
     * 清空佇列
     */
    IQueue ClearQueue();

    /**
     * 佇列判空
     */
    Boolean isEmpty();

    /**
     * 返回佇列長度
     */
    Integer QueueLength();

    /**
     * 返回佇列頭元素
     */
    T GetHead();

    /**
     * 插入隊尾元素
     */
    Boolean EnQueue(T e);

    /**
     * 刪除隊頭元素  即出隊
     */
    T DeQueue();

}

節點

package Interface;

public class LNode<T> {
    private T data;
    private LNode next;

    public LNode() {

    }

    public LNode(T data, LNode next) {
        this.data = data;
        this.next = next;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public LNode getNext() {
        return next;
    }

    public void setNext(LNode next) {
        this.next = next;
    }
}

連結串列實現

package impl;

import Interface.IQueue;
import Interface.LNode;

import java.util.LinkedList;

/**
 * 鏈佇列
 * <p>
 * 鏈佇列中 需要有隊頭和隊尾指標,且為了表示方便 這裡新增一個頭節點
 * 因此鏈佇列判空的條件為 隊頭和隊尾指標均指向頭節點
 * 鏈佇列的操作即是單鏈表的插入和刪除操作的特殊情況
 *
 * @param <T>
 */
public class LinkedQueue<T> implements IQueue {


    private LNode Header;//頭指標 指向頭節點  即隊首元素的前一個位置 (作用 方便刪除隊首元素,方便判斷佇列是否滿)
    private LNode TaillPoint;//尾指標
    private Integer size;

    public IQueue InitQueue() {
        if (Header == null) {
            Header = new LNode<T>(); //例項化頭節點
            //頭尾指標均指向頭節點
            TaillPoint = Header;
            size = 0;
        }
        return this;
    }

    public IQueue DestroyQueue() {
        //銷燬
        Header = null;
        TaillPoint = Header;
        size = 0;
        return this;
    }

    public IQueue ClearQueue() {
        //頭尾指標均指向頭節點
        TaillPoint = Header;
        size = 0;
        return this;
    }

    public Boolean isEmpty() {
        if (TaillPoint == Header) {
            return Boolean.TRUE;
        } else {
            return Boolean.FALSE;
        }
    }

    public Integer QueueLength() {
        return size;
    }

    public T GetHead() {
        return (T) Header.getNext().getData();
    }

    public Boolean EnQueue(Object e) {
        //入隊 從隊尾入
        LNode newNode = new LNode<T>((T) e, null);
        TaillPoint.setNext(newNode);
        TaillPoint = newNode;
        size++;
        return Boolean.TRUE;
    }

    public T DeQueue() {
        //刪除的時候 如果是最後一個元素, 這個時候尾指標需要調整為指向頭節點。 ps:至始至終 頭節點本身不需要變,但是頭節點指向的next指標要變
        if (Header.getNext().getNext()==null ) {
            T e = (T) Header.getNext().getData();
            Header.setNext(null);
            TaillPoint = Header;
            return e;
        }
        T e = (T) Header.getNext().getData();
        Header.setNext(Header.getNext().getNext());
        size--;
        return e;
    }


    public static void main(String[] args) {
        LinkedQueue<Integer> linkedQueue = new LinkedQueue<Integer>();
        linkedQueue.InitQueue();
        linkedQueue.EnQueue(1);
        linkedQueue.EnQueue(2);
        linkedQueue.EnQueue(3);
        Integer s = linkedQueue.size;
        System.out.println(linkedQueue.GetHead());
        for (Integer integer = 0; integer < s; integer++) {
            System.out.println(linkedQueue.DeQueue());
        }
        System.out.println(linkedQueue.isEmpty());
    }
}

輸出結果:
1
1
2
3
true

原始碼的github地址,可以下載到本地執行