[swift] [09_queue] [add]
This commit is contained in:
parent
d1f416973e
commit
fc167fd11f
112
swift/09_queue/ArrayQueue.swift
Normal file
112
swift/09_queue/ArrayQueue.swift
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
//
|
||||||
|
// Created by Jiandan on 2018/10/11.
|
||||||
|
// Copyright (c) 2018 Jiandan. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
/// 用数组实现的队列
|
||||||
|
struct ArrayQueue<T>: Queue {
|
||||||
|
typealias Element = T
|
||||||
|
|
||||||
|
/// 数组
|
||||||
|
private var items: [Element]
|
||||||
|
/// 数组最大长度
|
||||||
|
private var capacity = 0
|
||||||
|
/// 队头下标
|
||||||
|
private var head = 0
|
||||||
|
/// 队尾下标
|
||||||
|
private var tail = 0
|
||||||
|
|
||||||
|
/// 构造方法
|
||||||
|
/// - parameter defaultElement: 默认元素
|
||||||
|
/// - parameter capacity: 数组长度
|
||||||
|
init(defaultElement: Element, capacity: Int) {
|
||||||
|
self.capacity = capacity
|
||||||
|
items = [Element](repeating: defaultElement, count: capacity)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: Protocol: Queue
|
||||||
|
|
||||||
|
var isEmpty: Bool { return head == tail }
|
||||||
|
|
||||||
|
var size: Int { return tail - head }
|
||||||
|
|
||||||
|
var peek: Element? { return isEmpty ? nil : items[head] }
|
||||||
|
|
||||||
|
// 没有数据搬移的实现,即实现了一个有界序列
|
||||||
|
// mutating func enqueue(newElement: Element) -> Bool {
|
||||||
|
// // 整个队列都占满了
|
||||||
|
// if tail == capacity {
|
||||||
|
// return false
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// items[tail] = newElement
|
||||||
|
// tail += 1
|
||||||
|
// return true
|
||||||
|
// }
|
||||||
|
// 有数据搬移的实现,即实现了一个无界序列
|
||||||
|
mutating func enqueue(newElement: Element) -> Bool {
|
||||||
|
// 如果 tail == capacity 表示队列末尾没有空间了
|
||||||
|
if tail == capacity {
|
||||||
|
// 整个队列都占满了
|
||||||
|
if head == 0 { return false }
|
||||||
|
// 数据搬移
|
||||||
|
for i in head ..< tail {
|
||||||
|
items[i - head] = items[i]
|
||||||
|
}
|
||||||
|
// 搬移完之后重新更新 head 和 tail
|
||||||
|
tail -= head
|
||||||
|
head = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
items[tail] = newElement
|
||||||
|
tail += 1
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
mutating func dequeue() -> Element? {
|
||||||
|
if isEmpty {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
let item = items[head]
|
||||||
|
head += 1
|
||||||
|
return item
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 使用2个数组实现无界队列,用到 Swift 中 Array 较多的方法
|
||||||
|
/// 来源:《iOS 面试之道》(故胤道长,唐巧)
|
||||||
|
struct ArrayQueue2<T>: Queue {
|
||||||
|
typealias Element = T
|
||||||
|
|
||||||
|
/// 输入数组,主要负责入队
|
||||||
|
var inArray = [Element]()
|
||||||
|
/// 输出数组,主要负责出队
|
||||||
|
var outArray = [Element]()
|
||||||
|
|
||||||
|
var isEmpty: Bool { return inArray.isEmpty && outArray.isEmpty }
|
||||||
|
|
||||||
|
var size: Int { return inArray.count + outArray.count }
|
||||||
|
|
||||||
|
// 当 outArray 为空时,返回 inArray 首个元素,否则返回 outArray 末尾元素
|
||||||
|
var peek: Element? { return outArray.isEmpty ? inArray.first : outArray.last }
|
||||||
|
|
||||||
|
mutating func enqueue(newElement: Element) -> Bool {
|
||||||
|
// inArray 添加元素
|
||||||
|
inArray.append(newElement)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
mutating func dequeue() -> Element? {
|
||||||
|
if outArray.isEmpty {
|
||||||
|
// 将 inArray 倒序存入 outArray 中
|
||||||
|
outArray = inArray.reversed()
|
||||||
|
// 清空 inArray
|
||||||
|
inArray.removeAll()
|
||||||
|
}
|
||||||
|
// 弹出 outArray 最后一个元素
|
||||||
|
return outArray.popLast()
|
||||||
|
}
|
||||||
|
}
|
63
swift/09_queue/CircularQueue.swift
Normal file
63
swift/09_queue/CircularQueue.swift
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
//
|
||||||
|
// Created by Jiandan on 2018/10/11.
|
||||||
|
// Copyright (c) 2018 Jiandan. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
/// 循环队列
|
||||||
|
struct CircularQueue<T>: Queue {
|
||||||
|
typealias Element = T
|
||||||
|
|
||||||
|
/// 数组
|
||||||
|
private var items: [Element]
|
||||||
|
/// 数组最大长度
|
||||||
|
private var capacity = 0
|
||||||
|
/// 队头下标
|
||||||
|
private var head = 0
|
||||||
|
/// 队尾下标
|
||||||
|
private var tail = 0
|
||||||
|
|
||||||
|
/// 构造方法
|
||||||
|
/// - parameter defaultElement: 默认元素
|
||||||
|
/// - parameter capacity: 数组长度
|
||||||
|
init(defaultElement: Element, capacity: Int) {
|
||||||
|
self.capacity = capacity
|
||||||
|
items = [Element](repeating: defaultElement, count: capacity)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: Protocol: Queue
|
||||||
|
|
||||||
|
var isEmpty: Bool { return head == tail }
|
||||||
|
|
||||||
|
var size: Int {
|
||||||
|
if tail >= head {
|
||||||
|
return tail - head
|
||||||
|
} else {
|
||||||
|
return (tail + 1) + (capacity - head)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var peek: Element? { return isEmpty ? nil : items[head] }
|
||||||
|
|
||||||
|
mutating func enqueue(newElement: Element) -> Bool {
|
||||||
|
// 整个队列都占满了
|
||||||
|
if (tail + 1) % capacity == head {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
items[tail] = newElement
|
||||||
|
tail = (tail + 1) % capacity
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
mutating func dequeue() -> Element? {
|
||||||
|
if isEmpty {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
let item = items[head]
|
||||||
|
head = (head + 1) % capacity
|
||||||
|
return item
|
||||||
|
}
|
||||||
|
}
|
21
swift/09_queue/Queue.swift
Normal file
21
swift/09_queue/Queue.swift
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// Created by Jiandan on 2018/10/11.
|
||||||
|
// Copyright (c) 2018 Jiandan. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
protocol Queue {
|
||||||
|
/// 持有的数据类型
|
||||||
|
associatedtype Element
|
||||||
|
/// 是否为空
|
||||||
|
var isEmpty: Bool { get }
|
||||||
|
/// 队列大小
|
||||||
|
var size: Int { get }
|
||||||
|
/// 返回队列头部元素
|
||||||
|
var peek: Element? { get }
|
||||||
|
/// 入队
|
||||||
|
mutating func enqueue(newElement: Element) -> Bool
|
||||||
|
/// 出队
|
||||||
|
mutating func dequeue() -> Element?
|
||||||
|
}
|
61
swift/09_queue/QueueBasedOnLinkedList.swift
Normal file
61
swift/09_queue/QueueBasedOnLinkedList.swift
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
//
|
||||||
|
// Created by Jiandan on 2018/10/11.
|
||||||
|
// Copyright (c) 2018 Jiandan. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
class Node<T> {
|
||||||
|
var value: T?
|
||||||
|
var next: Node?
|
||||||
|
|
||||||
|
init(value: T) {
|
||||||
|
self.value = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct QueueBasedOnLinkedList<T>: Queue {
|
||||||
|
typealias Element = T
|
||||||
|
|
||||||
|
/// 队首
|
||||||
|
var head: Node<Element>?
|
||||||
|
/// 队尾
|
||||||
|
var tail: Node<Element>?
|
||||||
|
|
||||||
|
// MARK: Protocol: Queue
|
||||||
|
|
||||||
|
var isEmpty: Bool { return head == nil }
|
||||||
|
|
||||||
|
var size: Int {
|
||||||
|
var count = 0
|
||||||
|
while head?.next != nil {
|
||||||
|
count += 1
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
var peek: Element? { return head?.value }
|
||||||
|
|
||||||
|
mutating func enqueue(newElement: Element) -> Bool {
|
||||||
|
if isEmpty {
|
||||||
|
// 空队列
|
||||||
|
let node = Node(value: newElement)
|
||||||
|
head = node
|
||||||
|
tail = node
|
||||||
|
} else {
|
||||||
|
tail!.next = Node(value: newElement)
|
||||||
|
tail = tail!.next
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
mutating func dequeue() -> Element? {
|
||||||
|
if isEmpty {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
let node = head
|
||||||
|
head = head!.next
|
||||||
|
return node?.value
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user