迴圈連結串列與迴圈佇列
阿新 • • 發佈:2019-01-02
單向迴圈連結串列
和普通的連結串列結構不同,單向迴圈連結串列的最後一個節點的指標指向了頭結點,也就是和Head指標有相同的引用
和普通連結串列相比,迴圈連結串列不需要頭指標,能夠從任意位置實現連結串列遍歷
雙向迴圈連結串列
和單向連結串列相比,雙向連結串列多了一個指向上一個節點的前向指標
相比於單向連結串列,雙向迴圈連結串列的遍歷更加靈活,但缺點是,進行插入和刪除操作需要修改更多的指標
佇列的“假溢位”
如上圖所示,front和rear分別是佇列的頭、尾指標,在出入佇列的過程中會出現一種現象:尾指標指向了對壘的尾部,也就是達到了maxSize,但這是,頭指標並沒有指向對頭,這樣就造成的儲存空間的浪費,也會導致佇列無法繼續實現入隊、出隊操作。因此,提出了迴圈佇列。
優先順序佇列
和普通的佇列相比,優先順序佇列在出棧是是按照優先順序進行的,也就是每次選取優先順序最高的元素出列,這在計算機的任務排程中有很大的用處
private Object element; //資料域
private int priority; //用整型數字表示對雷元素的優先順序
public Element(Object element, int priority) {
this.element = element;
this.priority = priority;
}
public Object delete() { if(isEmpty()){ //判斷佇列是否為空 System.out.println("佇列為空"); } //找優先順序最低的元素,預設為隊頭元素 Element MIN = queue[0]; int index = 0; for (int i = 0; i < count; i++) { if(queue[i].getPriority() < MIN.getPriority()){ MIN = queue[i]; index = i; } } //出隊,後面的元素向前移 for (int i = index + 1; i < count; i++) { queue[i -1] = queue[i]; } rear--; count--; return MIN; }
迴圈佇列
附上迴圈對壘的程式碼:
public class ImplQueue implements CircularQueue{ static final int defauleSize = 10; int front,rear,count,maxSize; Object[] queue; public static void main(String[] args) { ImplQueue circleQueue = new ImplQueue(); circleQueue.append(10); circleQueue.append("d"); circleQueue.append("sss"); circleQueue.append(1); System.out.println(circleQueue.isEmpty()); System.out.println(circleQueue.getFront()); while (!circleQueue.isEmpty()){ System.out.println(circleQueue.delete()); } } //預設佇列長度 public ImplQueue() { rear = 0; front = 0; count = 0; maxSize = defauleSize; queue = new Object[defauleSize]; } //自定義佇列那長度 public ImplQueue(int maxSize) { this.maxSize = maxSize; rear = 0; front = 0; count = 0; queue = new Object[maxSize]; } @Override public void append(Object obj) { //判斷佇列是否為滿 if(front == rear && count > 0) { System.out.println("佇列已滿,無法插入"); }else { queue[rear] = obj; rear = (rear + 1) % maxSize; count++; } } @Override public Object delete() { Object obj = null; //判斷佇列是否為空 if(isEmpty()){ System.out.println("佇列為空,無法刪除"); }else { obj = queue[front]; front = (front +1) % maxSize; count--; } return obj; } @Override public Object getFront() { Object obj = null; if(isEmpty()){ System.out.println("佇列為空"); }else { obj = queue[front]; } return obj; } @Override public boolean isEmpty() { return count == 0; } }