可以像普通佇列一樣,擁有從隊首出隊、從隊尾入隊的特性外,雙向佇列,也可以從隊首入隊,從隊尾出隊。
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容器 即一小塊連續的空間,該空間中每個元素都是指標,指向另一段 較...