鏈隊列:
隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(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