JAVA數據結構——隊列

鏈隊列:

隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭。隊列中沒有元素時,稱爲空隊列。
隊列的數據元素又稱爲隊列元素。在隊列中插入一個隊列元素稱爲入隊,從隊列中刪除一個隊列元素稱爲出隊。因爲隊列只允許在一端插入,在另一端刪除,所以只有最早進入隊列的元素才能最先從隊列中刪除,故隊列又稱爲先進先出(FIFO—first in first out)線性表。

因爲隊列的性質,所以我們可以用來解決素數環(指的是將從1到n這n個整數圍成一個圓環,若其中任意2個相鄰的數字相加,結果均爲素數,那麼這個環就成爲素數環。)的問題。

package com.usts.edu.Queue;

/**
 * Created by Guanzhong Hu
 * Date :2019/12/29
 * Description : 隊列 接口
 * Version :1.0
 */
public interface IQueue {

    public void clear(); // 置空

    public boolean isEmpty(); //判空,front = null

    public int length(); // 返回計數 length

    public Object peek(); // 讀取隊首元素

    public void offer(Object x) throws Exception; // 插入新的元素,使其成爲新的隊尾元素

    public Object poll();// 出隊操作


}
package com.usts.edu.Queue;

import com.sun.org.apache.xpath.internal.objects.XNull;
import com.usts.edu.list.Node;

/**
 * Created by Guanzhong Hu
 * Date :2019/12/29
 * Description : 鏈式隊列實現
 * Version :1.0
 */
public class LinkQueue implements IQueue {
    private Node front;// 隊頭的引用

    private Node rear;// 隊尾的引用,指向隊尾元素

    // 鏈隊列類的構造函數
    public LinkQueue() {
        front = rear = null;
    }

    // 將一個已經存在的隊列置成空
    public void clear() {
        front = rear = null;

    }

    // 測試隊列是否爲空
    public boolean isEmpty() {
        return front == null;
    }

    // 求隊列中的數據元素個數並由函數返回其值
    public int length() {
        Node p = front;
        int length = 0;// 隊列的長度
        while (p != null) {// 一直查找到隊尾
            p = p.next;
            ++length;// 長度增1
        }
        return length;
    }

    // 把指定的元素插入隊列
    public void offer(Object o) {
        Node p = new Node(o);// 初始化新的結點
        if (front != null) {// 隊列非空
            rear.next = p;
            rear = p;// 改變隊列尾的位置
        } else
            // 隊列爲空
            front = rear = p;
    }

    // 查看隊列的頭而不移除它,返回隊列頂對象,如果此隊列爲空,則返回 null
    public Object peek() {
        if (front != null) // 隊列非空
            return front.data;// 返回隊列元素
        else
            return null;
    }

    // 移除隊列的頭並作爲此函數的值返回該對象,如果此隊列爲空,則返回 null
    public Object poll() {
        if (front != null) { // 隊列非空
            Node p = front;// p指向隊列頭結點
            front = front.next;
            if (p == rear)       //被刪的結點是隊尾結點
                rear = null;
            return p.data;// 返回隊列頭結點數據
        } else
            return null;
    }

    // 打印函數,打印所有隊列中的元素(隊列頭到隊列尾)
    public void display() {
        if (!isEmpty()) {
            Node p = front;
            while (p != rear.next) {// 從對頭到隊尾
                System.out.print(p.data.toString() + " ");
                p = p.next;
            }
        } else {
            System.out.println("此隊列爲空");
        }
    }
}

素數環問題,無論用回溯法還是遞歸法,使用鏈表可以很方便的解決這個問題。

gitee源碼地址:

https://gitee.com/jockhome/data_structure

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章