实现一个 队列
,包括 enqueue
、dequeue
、peek
。
Queue
队列
核心也是 array,A queue gives you a FIFO or first-in, first-out order. 队列是:先进先出的。
public struct Queue<T> { fileprivate var array = [T]() }
|
enqueue
进队,在数组尾部追加元素。
public mutating func enqueue(_ element: T) { array.append(element) }
|
dequeue
出队,将首位的元素移除。因为首位元素移除后,其他元素依次向前移动,所以是 O(n)。
public var isEmpty: Bool { return array.isEmpty }
public mutating func dequeue() -> T? { if isEmpty { return nil } else { return array.removeLast() } }
|
peek
查看队首元素。
public var front: T? { return array.first }
|
优化出队
在出队后不移动元素而是移动 起始索引
,就像动的收银台而不是排队的人。
public struct OptimizedQueue<T> {
fileprivate var array = [T?]() fileprivate var head = 0
public var count: Int { return array.count - head }
public var isEmpty: Bool { return count == 0 }
public mutating func enqueue(_ element: T) { array.append(element) }
public mutating func dequeue() -> T? { guard head < array.count, let element = array[head] else { return nil } array[head] = nil head += 1
let percentage = Double(head)/Double(array.count) if array.count > 50 && percentage > 0.25 { array.removeFirst(head) head = 0 }
return element }
public var front: T? { if isEmpty { return nil } else { return array[head] } } }
|
文章代码:GitHub - imzyf/data-structure-and-algorithm/002-Queue/。
References