1. 程式人生 > >迴圈連結串列與迴圈佇列

迴圈連結串列與迴圈佇列

單向迴圈連結串列

和普通的連結串列結構不同,單向迴圈連結串列的最後一個節點的指標指向了頭結點,也就是和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;
    }
}