Open longlivedrgn opened 5 months ago
이번주는 개조식으로 써보겠습니다~
배열
연결 리스트
노드는 아래와 같이 value와 next 값을 가지고 있다.
class Node<T> {
var value: T
var next: Node<T>?
init(value: T, next: Node<T>?) {
self.value = value
self.next = next
}
}
링크드 리스트는 아래와 같은 구조를 가지고 있다. head/tail
class LinkedList<T> {
var head: Node<T>?
var tail: Node<T>?
init (head: Node<T>?) {
self.head = head
self.tail = head
}
}
스택
큐
하나의 Array로 구현
→ dequeue할 때 O(n)
struct QueueArray<T>: Queue {
private var array: [T] = []
var isEmpty: Bool {
return array.isEmpty
}
var peek: T? {
return array.first
}
mutating func enqueue(_ element: T) {
array.append(element)
}
@discardableResult
mutating func dequeue() -> T? {
return isEmpty ? nil : array.removeFirst()
}
}
두 개의 Array로 구현
→ dequeue할 때 O(1)
struct QueueStack<T>: Queue {
private var dequeueStack: [T] = []
private var enqueueStack: [T] = []
var isEmpty: Bool {
return dequeueStack.isEmpty && enqueueStack.isEmpty
}
var peek: T? {
return !dequeueStack.isEmpty ? dequeueStack.last : enqueueStack.first
}
mutating func enqueue(_ element: T) {
enqueueStack.append(element)
}
@discardableResult
mutating func dequeue() -> T? {
if dequeueStack.isEmpty {
dequeueStack = enqueueStack.reversed()
enqueueStack.removeAll()
}
return dequeueStack.popLast()
}
}
Hashable
분리 연결법(Separate Chaining)
개방 주소법(Open Addressing)
Array
)LinkedList
)