Deque 雙向佇列 Swift實現

2021-09-11 14:49:14 字數 1798 閱讀 8412

可以像普通佇列一樣,擁有從隊首出隊、從隊尾入隊的特性外,雙向佇列,也可以從隊首入隊,從隊尾出隊。

struct

deque

var

count: int

//從隊尾入隊

mutating

func

enqueue

(_ element: t)

//從隊首入隊

mutating

func

enqueuefront

(_ element: t)

//從隊首出隊

mutating

func

dequeue

() -> t? else

}//從隊尾出隊

mutating

func

dequeueback

() -> t? else

}//檢視隊首元素

func

peekfront

() -> t?

//檢視隊尾元素

func

peekback

() -> t?

}複製**

上面就是對雙向佇列的簡單實現,但是存在如下問題:

同時我們會疑問,為什麼在陣列的尾部進行插入和刪除操作時,不錯在上面的問題呢,這就和swift中陣列的實現機制有關了,在swift中,在陣列初始化後,在陣列的最後面面,會預留出一些空的位置,來以備將來在末尾增加新的元素。

//初始化陣列

var arr = ["a", "b", "c"]

//實際在陣列中情況為

["a", "b", "c", **, **, **]

//** 就是預留出來的記憶體,以備將來插入新的元素

// 實際情況為

["a", "b", "c", "d", **, **]

複製**

借鑑上面的思路,我們也可以在雙向佇列的實現中,自己實現這種類似的機制,來解決問題1,2.

struct

deque

//判空

var isempty: bool

varcount: int

//從隊尾入隊

mutating

func

enqueue

(_ element: t)

//從隊首入隊

mutating

func

enqueuefront

(_ element: t)

head -= 1

array.insert(element, at: head)

}//從隊首出隊

mutating

func

dequeue

() -> t?

array[head] = nil

//標記陣列頭部增加1

head += 1

//定期去除多餘的空間

if head >= spacecount*2

return element

}//從隊尾出隊

mutating

func

dequeueback

() -> t? else

}//檢視隊首元素

func

peekfront

() -> t?

//檢視隊尾元素

func

peekback

() -> t?

}複製**

新的實現方法,主要有以下的幾處改變:

deque雙向佇列

deque雙向佇列是一種雙向開口的連續線性空間,可以高效的在頭尾兩端插入和刪除元素,deque在介面上和vector非常相似,下面列出deque的常用成員函式 deque的實現比較複雜,內部會維護乙個map 注意!不是stl中的map容器 即一小塊連續的空間,該空間中每個元素都是指標,指向另一段 較...

deque雙向佇列

deque雙向佇列是一種雙向開口的連續線性空間,可以高效的在頭尾兩端插入和刪除元素,deque在介面上和vector非常相似,下面列出deque的常用成員函式 deque的實現比較複雜,內部會維護乙個map 注意!不是stl中的map容器 即一小塊連續的空間,該空間中每個元素都是指標,指向另一段 較...

deque雙向佇列

deque雙向佇列是一種雙向開口的連續線性空間,可以高效的在頭尾兩端插入和刪除元素,deque在介面上和vector非常相似,下面列出deque的常用成員函式 deque的實現比較複雜,內部會維護乙個map 注意!不是stl中的map容器 即一小塊連續的空間,該空間中每個元素都是指標,指向另一段 較...