參考鏈接
像棧一樣,隊(duì)列(queue)也是一種線性表,它的特性是先進(jìn)先出,插入在一端,刪除在另一端。就像排隊(duì)一樣,剛來的人入隊(duì)(push)要排在隊(duì)尾(rear),每次出隊(duì)(pop)的都是隊(duì)首(front)的人。如圖1,描述了一個(gè)隊(duì)列模型。
和棧一樣,隊(duì)列也有數(shù)組實(shí)現(xiàn)和鏈表實(shí)現(xiàn)兩種,兩種實(shí)現(xiàn)都能給出快速的O(1)運(yùn)行時(shí)間,區(qū)別在于鏈表實(shí)現(xiàn)指針域要占用空間,頻繁的new和delete會(huì)消耗不少的時(shí)間開銷,數(shù)組實(shí)現(xiàn)唯一的缺點(diǎn)是建立時(shí)要確定空間大小。
假如一個(gè)隊(duì)列最多只能站10個(gè)人,當(dāng)占滿10個(gè)人后,第11個(gè)人就不能入隊(duì),這種情況成為溢出。而如果第一個(gè)人出隊(duì)了,剩下的9個(gè)人依然還在原來的位置,隊(duì)列里空出了一個(gè)位置,但第11個(gè)人還是不能入隊(duì),這種情況成為假溢出。克服假溢出有效的辦法是使用循環(huán)隊(duì)列。
循環(huán)隊(duì)列就是把隊(duì)尾和隊(duì)首連接起來,形成一個(gè)環(huán),隊(duì)尾的下一個(gè)位置就是隊(duì)首,這樣可以有效的防止假溢出現(xiàn)象,但隊(duì)列的實(shí)際容量已然固定。
隊(duì)列的實(shí)現(xiàn)
隊(duì)列的數(shù)組實(shí)現(xiàn)和棧差不多,不同的是,棧用top做下標(biāo),隊(duì)列用front和rear作為下標(biāo)。
/// 用鏈表實(shí)現(xiàn)的隊(duì)列
public class YYQueue<T> {
private var container = YYList<T>()
public var count: Int { container.length }
public var isEmpty: Bool { container.isEmpty }
public func push(node: T) {
container.append(node)
}
public func pop() -> T? {
container.pop()
}
public func front() -> T? {
container.head?.value
}
public func rear() -> T? {
container.tail?.value
}
public func cleanup() {
container.cleanup()
}
}
/// 用數(shù)組實(shí)現(xiàn)的隊(duì)列
public class YYQueue2<T> {
private var container = [T]()
public var count: Int { container.count }
public var isEmpty: Bool { container.isEmpty }
public func push(node: T) {
container.append(node)
}
public func pop() -> T? {
container.removeFirst()
}
public func front() -> T? {
container.first
}
public func rear() -> T? {
container.last
}
public func cleanup() {
container.removeAll()
}
}