Skip to content

Commit 8fb9105

Browse files
committed
校对 双端队列
1 parent 12f7473 commit 8fb9105

File tree

6 files changed

+241
-99
lines changed

6 files changed

+241
-99
lines changed

Deque/Deque-Optimized.swift

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/**
2+
* 优化的双端队列。
3+
* 出队和入队操作都是 O(1)。
4+
*/
5+
public struct Deque<T> {
6+
private var array: [T?]
7+
private var head: Int
8+
private var capacity: Int
9+
private let originalCapacity: Int
10+
11+
public init(_ capacity: Int = 10) {
12+
self.capacity = max(capacity, 1)
13+
originalCapacity = self.capacity
14+
array = [T?](repeating: nil, count: capacity)
15+
head = capacity
16+
}
17+
18+
public var isEmpty: Bool {
19+
return count == 0
20+
}
21+
22+
public var count: Int {
23+
return array.count - head
24+
}
25+
26+
public mutating func enqueue(_ element: T) {
27+
array.append(element)
28+
}
29+
30+
public mutating func enqueueFront(_ element: T) {
31+
if head == 0 { // 队列前面空白空间耗尽时,需要添加
32+
capacity *= 2
33+
let emptySpace = [T?](repeating: nil, count: capacity)
34+
array.insert(contentsOf: emptySpace, at: 0)
35+
head = capacity
36+
}
37+
38+
head -= 1
39+
array[head] = element
40+
}
41+
42+
public mutating func dequeue() -> T? {
43+
guard head < array.count, let element = array[head] else { return nil }
44+
45+
array[head] = nil
46+
head += 1
47+
48+
if capacity >= originalCapacity && head >= capacity*2 { // 清理队列前面有时多于的空白空间
49+
let amountToRemove = capacity + capacity/2
50+
array.removeFirst(amountToRemove)
51+
head -= amountToRemove
52+
capacity /= 2
53+
}
54+
return element
55+
}
56+
57+
public mutating func dequeueBack() -> T? {
58+
if isEmpty {
59+
return nil
60+
} else {
61+
return array.removeLast()
62+
}
63+
}
64+
65+
public func peekFront() -> T? {
66+
if isEmpty {
67+
return nil
68+
} else {
69+
return array[head]
70+
}
71+
}
72+
73+
public func peekBack() -> T? {
74+
if isEmpty {
75+
return nil
76+
} else {
77+
return array.last!
78+
}
79+
}
80+
}

Deque/Deque-Simple.swift

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
2+
/**
3+
* 简单的双端队列
4+
*/
5+
public struct Deque<T> {
6+
private var array = [T]()
7+
8+
public var isEmpty: Bool {
9+
return array.isEmpty
10+
}
11+
12+
public var count: Int {
13+
return array.count
14+
}
15+
16+
public mutating func enqueue(_ element: T) {
17+
array.append(element)
18+
}
19+
20+
public mutating func enqueueFront(_ element: T) {
21+
array.insert(element, at: 0)
22+
}
23+
24+
public mutating func dequeue() -> T? {
25+
if isEmpty {
26+
return nil
27+
} else {
28+
return array.removeFirst()
29+
}
30+
}
31+
32+
public mutating func dequeueBack() -> T? {
33+
if isEmpty {
34+
return nil
35+
} else {
36+
return array.removeLast()
37+
}
38+
}
39+
40+
public func peekFront() -> T? {
41+
return array.first
42+
}
43+
44+
public func peakBack() -> T? {
45+
return array.last
46+
}
47+
}

Deque/Deque.playground/Contents.swift

Lines changed: 62 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,58 @@
11

2-
2+
/**
3+
* 优化的双端队列。
4+
* 出队和入队操作都是 O(1)。
5+
*/
36
public struct Deque<T> {
4-
private var array = [T]()
7+
private var array: [T?]
8+
private var head: Int
9+
private var capacity: Int
10+
private let originalCapacity: Int
11+
12+
public init(_ capacity: Int = 10) {
13+
self.capacity = max(capacity, 1)
14+
originalCapacity = self.capacity
15+
array = [T?](repeating: nil, count: capacity)
16+
head = capacity
17+
}
518

619
public var isEmpty: Bool {
7-
return array.isEmpty
20+
return count == 0
821
}
922

1023
public var count: Int {
11-
return array.count
24+
return array.count - head
1225
}
1326

1427
public mutating func enqueue(_ element: T) {
1528
array.append(element)
1629
}
1730

1831
public mutating func enqueueFront(_ element: T) {
19-
array.insert(element, at: 0)
32+
if head == 0 {
33+
capacity *= 2
34+
let emptySpace = [T?](repeating: nil, count: capacity)
35+
array.insert(contentsOf: emptySpace, at: 0)
36+
head = capacity
37+
}
38+
39+
head -= 1
40+
array[head] = element
2041
}
2142

2243
public mutating func dequeue() -> T? {
23-
if isEmpty {
24-
return nil
25-
} else {
26-
return array.removeFirst()
44+
guard head < array.count, let element = array[head] else { return nil }
45+
46+
array[head] = nil
47+
head += 1
48+
49+
if capacity >= originalCapacity && head >= capacity*2 {
50+
let amountToRemove = capacity + capacity/2
51+
array.removeFirst(amountToRemove)
52+
head -= amountToRemove
53+
capacity /= 2
2754
}
55+
return element
2856
}
2957

3058
public mutating func dequeueBack() -> T? {
@@ -36,10 +64,32 @@ public struct Deque<T> {
3664
}
3765

3866
public func peekFront() -> T? {
39-
return array.first
67+
if isEmpty {
68+
return nil
69+
} else {
70+
return array[head]
71+
}
4072
}
4173

42-
public func peakBack() -> T? {
43-
return array.last
74+
public func peekBack() -> T? {
75+
if isEmpty {
76+
return nil
77+
} else {
78+
return array.last!
79+
}
4480
}
4581
}
82+
83+
84+
var deque = Deque<Int>()
85+
deque.enqueue(1)
86+
deque.enqueue(2)
87+
deque.enqueue(3)
88+
deque.enqueue(4)
89+
90+
deque.dequeue() // 1
91+
deque.dequeueBack() // 4
92+
93+
deque.enqueueFront(5) // deque: [5, 2, 3]
94+
95+
deque.dequeue() // 5

0 commit comments

Comments
 (0)