Dequeue는 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료구조로, 이를 통해 큐와 스택의 기능을 모두 수행할 수 있습니다.
Dequeue를 구조체와 배열을 이용해 구현할 수 있습니다.
제네릭을 활용하여 Dequeue 구조체를 정의하고, 주요 기능들을 구현해보겠습니다.
struct Deque<T> {
private var enqueue: [T] = [] // 뒤쪽에서 요소를 추가/제거하는 배열
private var dequeue: [T] = [] // 앞쪽에서 요소를 추가/제거하는 배열
var count: Int {
return enqueue.count + dequeue.count
}
var isEmpty: Bool {
return enqueue.isEmpty && dequeue.isEmpty
}
var first: T? {
return dequeue.isEmpty ? enqueue.first : dequeue.last
}
var last: T? {
return enqueue.isEmpty ? dequeue.first : enqueue.last
}
mutating func pushFirst(_ n: T) {
dequeue.append(n)
}
mutating func pushLast(_ n: T) {
enqueue.append(n)
}
mutating func popFirst() -> T? {
if dequeue.isEmpty {
dequeue = enqueue.reversed()
enqueue.removeAll()
}
return dequeue.popLast()
}
mutating func popLast() -> T? {
if enqueue.isEmpty {
dequeue.reverse()
let returnValue = dequeue.popLast()
dequeue.reverse()
return returnValue
} else {
return enqueue.popLast()
}
}
}
위 코드에서는 Dequeue의 기본 동작을 구현했습니다.
- pushFirst(_:): 앞쪽에 요소를 추가합니다. 시간 복잡도는 O(1)입니다.
- pushLast(_:): 뒤쪽에 요소를 추가합니다. 요소를 배열의 첫 번째 위치에 삽입하므로, 시간 복잡도는 O(n)입니다.
- popFirst(): 앞쪽에서 요소를 제거하고 반환합니다. 시간 복잡도는 평균 O(1), 최악의 경우 O(n)입니다.
- popFront(): 뒤쪽에서 요소를 제거하고 반환합니다. 시간 복잡도는 평균 O(1), 최악의 경우 O(n)입니다.
이 Dequeue 구조체는 다음과 같이 사용할 수 있습니다
var deque = Deque<Int>()
deque.pushLast(1)
deque.pushLast(2)
deque.pushFirst(0)
print(deque.popFirst() ?? -1) // 출력: 0
print(deque.popLast() ?? -1) // 출력: 2
print(deque.count) // 출력: 1
print(deque.isEmpty) // 출력: false
이렇게 Dequeue를 사용하면, 큐와 스택의 기능을 모두 수행할 수 있는 유연한 자료구조를 만들 수 있습니다.
반응형
'🖥️ Computer Science > Data Structure' 카테고리의 다른 글
[Swift] 우선순위 큐(Priority Queue) 구현하기 (0) | 2024.09.27 |
---|---|
[Swift] 힙(Heap) 구현하기 (0) | 2024.09.27 |
[Swfit] 큐(Queue) 구현하기 (1) | 2024.09.27 |
[Swift] 스택(Stack) 구현하기 (0) | 2024.09.27 |
[자료구조] 해시 테이블(Hash Table) (0) | 2023.03.15 |
댓글