資料結構 佇列(二)

2021-09-17 04:11:25 字數 2955 閱讀 2427

## 引入

## 概念簡述

## 特點

## 原理實現

## 時間複雜度分析

通過前面對陣列佇列的學習我們可以發現,當進行出隊操作時,佇列中的每乙個元素都需要向前挪動一位

也正因此出隊操作的時間複雜度為o(n)。那麼可不可以在進行出隊操作時保持隊內元素不動?這樣的話時間

複雜度將變為o(1),可以很好地優化我們的結構,提公升效率。

在陣列中記錄隊首元素位置(front)與隊尾元素的下乙個位置(tail),當進行出隊操作時,通過維護front的指

向,進而避免內部元素發生挪動;由於隊首元素挪出陣列後,空出來的空間沒有被其他元素占用(可用),

當後續有其他元素入隊直至隊尾元素已經處於陣列末尾時,可以將後續元素放入之前出隊元素空出來的位置

並重新維護tail的指向即可。形式上形成了一種類似環狀的結構,故稱之為迴圈佇列。

[注意]:

1. 隊列為空:front  ==  tail

隊列為滿:(tail + 1) % capacity == front

2. 隊尾變數tail維護公式:

(tail + 1) % capacity

其中:front隊首元素索引

tail隊尾元素的下乙個位置索引

capacity陣列長度

1. 出隊操作不再需要佇列內部所有元素進行挪動,只需要表示頭部的索引改變即可,時間複雜度降為o(1)

2. 因為是迴圈佇列,內部元素儲存形成環狀結構,故所有對於標誌性變數(隊首/隊尾)的維護都需要進行取餘

操作以表示迴圈處理。

1. 準備介面

// 準備介面

public inte***ce queue

2. 準備實現類

// 準備實現類:

public class loopqueueimplements queue

public loopqueue(int capacity)

@override

public int getsize()

@override

public boolean isempty()

// 入隊

@override

public void enqueue(e e)

data[tail] = e; // 裝載元素

tail = (tail + 1) % data.length; // tail繼續指向隊尾元素的下乙個位置

size++; // 元素數量記錄 +1

}// 出隊

@override

public e dequeue()

e ret = data[front]; // 獲取元素

data[front] = null; // 隊首元素置空

front = (front + 1) % data.length; // front重新指向當前隊首元素

size--; // 元素數量記錄 -1

// 縮容處理

if(size == getcapacity()/4 && getcapacity()/2!=0)

return ret;

}@override

public e getfront()

return data[front];

}@override

public string tostring()

}return res.tostring();

}public int getcapacity()

private void resize(int newcapacity)

data = newdata;

front = 0;

tail = size;

}}

3. 準備測試類

// 準備測試類

public static void main(string args)

}}

void enqueue(e)              o(1)      //均攤

e dequeue()                     o(1)      //均攤      

e front()                            o(1)    

int getsize()                      o(1)    

boolean isempty               o(1)

[注意]:

相比於陣列佇列,迴圈佇列只是對其出隊操作進行了優化,通過維護隊首元素的變數,使得每當有元素

出隊時不再需要挪動其他元素,提公升了效率。同時也借助迴圈保證空間不被浪費。

資料結構之佇列(二) 鏈佇列

鏈佇列採用帶頭結點的鍊錶,隊頭指標始終指向頭結點,隊尾指標始終指向最後乙個元素 當隊列為空時 隊頭指標和隊尾指標均指向頭結點 鏈佇列不會滿!鏈佇列的定義 2.定義鏈佇列結構體 分別儲存兩個結點指標,隊頭指標和隊尾指標 typedef char datatype typedef struct node...

資料結構(二) 佇列

一 佇列定義 佇列是限定在一端進行插入,另一端進行刪除特殊線性表。二 佇列基本操作 入隊出隊 三 佇列例題 1.例1 舞伴配對問題 分析 這一題是一道經典的取模運算,每一次將編號往前加一位,到達n就取模。include include include include int main return ...

Java資料結構之佇列(二)

迴圈佇列避免空間浪費 迴圈佇列不使用動態陣列,底層的動態陣列自己維護 author zyw param public class loopqueueimplements myqueue public loopqueue public int getcapacity override public v...