- 队列的本质是一个数组,但只能从队尾添加元素,从队首移除元素。这保证了第一个入队的元素总是第一个出队。先到先得!
- 队列可以保证元素存入和取出的顺序是先进先出(first-in first-out, FIFO)的,第一个入队的元素总是第一个出队,公平合理!
public struct Queue<T> {
private var array = [T]()
public var isEmpty: Bool {
return array.isEmpty
}
public var count: Int {
return array.count
}
public mutating func enqueue(_ element: T) {
array.append(element)
}
public mutating func dequeue() -> T? {
if isEmpty {
return nil
} else {
return array.removeFirst()
}
}
public var front: T? {
return array.first
}
}
- 上面实现的队列只是可以正常工作,但并没有任何的优化。
- 你可能会好奇为什么在数组尾部添加元素的时间复杂度为 O(1),或者说只需要固定的时间。这是因为在 Swift 的内部实现中,数组的尾部总是有一些预设的空间可供使用。
- 当然,数组尾部的未使用内存的大小是有限的,如果最后一块未使用内存也被占用的时候,再添加元素会使得数组重新调整大小来获取更多的空间。
- 重新调整的过程包括申请新的内存,将已有数据迁移到新内存中。这个操作的时间复杂度是 O(n),所以是一个较慢的操作。但考虑到这种情况并不常见,所以,这个操作的时间复杂度依然是 O(1) 的,或者说是近似 O(1) 的。
- 但出队操作就有点不一样了。出队操作是将数组头部的元素移除,而不是尾部。这个操作的时间复杂度永远都是 O(n),因为这会导致内存的移位操作。