先進先出的排隊結構 佇列(Queue)

2021-09-29 17:38:25 字數 4043 閱讀 9806

與棧「後進先出」(lifo)的特性相對應,應當還有一種「先進先出」(fifo)特性的資料結構,這種資料結構被稱之為佇列(queue)。該結構的實現過程與棧幾乎類似,區別在於每次存入元素和獲取元素的位置不同。

【結構型別】線性結構

【底層實現】動態陣列(arraylist)

【核心方法】

public void enqueue(e e); //入隊

public e dequeue(); //出隊

public e getfront(); //獲取隊首的元素

1. 利用arraylist實現普通佇列

public

class

arrayqueue

implements

queue

/*** 無參構造器:利用預設值對例項域進行初始化

*/public

arrayqueue()

@override

public

void

enqueue

(e e)

@override

public e dequeue()

@override

public e getfront()

@override

public

boolean

isempty()

@override

public

intgetsize()

@override

public string tostring()

res.

("] tail");

return res.

tostring();}}

【改進思想】普通的陣列佇列(arrayqueue)進行出隊操作時,需要將後方的每乙個元素向前移動(時間複雜度為o(n)級別),這導致普通佇列的效能較低。我們期望更改佇列設計,以達到出隊操作不需要對後方元素進行遍歷,並且使得出隊操作完成後所閒置的空間能被迴圈利用。根據這種思想所改良的佇列就稱之為迴圈佇列(loopqueue)。

【改進方法】因為迴圈佇列(loopqueue)具有「空間再利用」的結構性,故底層無法直接使用原生的動態陣列(arraylist)實現,而需要在arraylist的基礎上進行重新改寫。

設計佇列的首/尾索引front和tail,初始化時預留乙個空間長度,令front == tail == 0,此時隊列為空

當(tail + 1) % data.length == front時,隊列為滿,觸發擴容操作。

縮容操作的觸發條件與arraylist類似,但要注意將預留空間除外。

2. 利用array實現迴圈佇列

public

class

loopqueue

implements

queue

/*** 無參構造器:用預設值初始化例項域

*/public

loopqueue()

/** * 方法:獲取陣列容量

* @return

*/public

intgetcapacity()

@override

public

void

enqueue

(e e)

// 將元素插入隊尾

data[tail]

= e;

// 尾索引後移一位

tail =

(tail +1)

% data.length;

// 元素個數加一

size++;}

@override

public e dequeue()

// 將隊首元素存入臨時變數

e ret = data[front]

;// 移除隊首元素

data[front]

= null;

// 首索引後移一位

front =

(front +1)

% data.length;

// 元素個數減一

size--

;// 當陣列3/4的空間為空時,進行縮容操作,新佇列大小為原來的一半

if(size ==

getcapacity()

/4&& size /2!=

0)// 返回臨時變數

return ret;

}/**

* 方法:對佇列的容量進行調整

* @param capacity 新佇列容量

*/private

void

resize

(int capacity)

// 將陣列變數引用至新陣列

data = newdata;

// 維護首/尾索引

front =0;

tail = size;

}@override

public e getfront()

return data[front];}

@override

public

boolean

isempty()

@override

public

intgetsize()

@override

public string tostring()

res.

("] tail");

return res.

tostring();}}

3. 利用linkedlist實現迴圈佇列
public

class

linkedlistqueue

implements

queue

public

node

(e e)

public

node()

}/**

* 例項域:首/尾指標、元素個數

*/private node head, tail;

private

int size;

/** * 無參構造器:用預設值對變數進行初始化

*/public

linkedlistqueue()

@override

public

void

enqueue

(e e)

else

// 元素個數加一

size++;}

@override

public e dequeue()

// 將待刪除的節點存入臨時變數

node delnode = head;

// 頭指標後移

head = head.next;

// 將待刪除節點指向空

delnode.next = null;

// 判斷陣列是否為空,若為空則將尾指標也賦為空

if(head == null)

// 元素個數減一

size--

;// 返回臨時變數所儲存的元素

return delnode.e;

}@override

public e getfront()

return head.e;

}@override

public

boolean

isempty()

@override

public

intgetsize()

@override

public string tostring()

res.

("null tail");

return res.

tostring();}}

佇列 先進先出

看前面的是什麼型別 指標 普通 出現指標指向空報錯的情況下,傳參不能為空,可以傳個空間的位址給他 queue front next null 從尾進 先進先出 define crt secure no warnings pragma once include include include incl...

佇列實現先進先出

1 入隊,如例 q.push x 將x 接到佇列的末端。2 出隊,如例 q.pop 彈出佇列的第乙個元素,注意,並不會返回被彈出元素的值。3 訪問隊首元素,如例 q.front 即最早被壓入佇列的元素。4 訪問隊尾元素,如例 q.back 即最後被壓入佇列的元素。5 判斷佇列空,如例 q.empty...

Golang實現先進先出佇列

package queue type queue struct type node struct next node func newqueue queue func q queue isempty bool func q queue size int func q queue enqueue it...