iOS - Queue 구현하기

longlivedrgn·2023년 1월 22일
0

iOS

목록 보기
7/10
post-thumbnail

💥 Queue 구현하기

  • Queue를 구현할 경우, 필수적으로 구현해야될 메소드가 몇가지 있다.
    • enqueue
    • dequeue
    • count
    • isEmpty
  • 일반 array로 구현하는 것보다 double stack으로 구현할 경우 dequeue시, 시간 복잡도면에서 이득을 볼 수 가 있다.

☀️ Array를 통한 Queue 구현

  • 일반 array로 queue를 구현해보면 아래와 같이 구현할 수 있다.
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()
  }
}

☀️ Double stack을 통하여 queue를 구현

  • Double stack을 통하여 queue를 구현해주면 아래와 같이 구현해 줄 수 있다.
  • 해당 방법은 일반 array일 때보다, dequeue시에 큰 이득을 얻을 수 있다.
    • 일반 array - dequeue ⇒ removeFirst() ⇒ O(n)
    • Double stack - 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()
  }
}
  • 나머지 연산은 동일한 시간 복잡도(O(1))을 갖지만, dequeue시에는 Double stack으로 queue를 구현하는 것이 시간복잡도면에서 더 유리하다.

📚 참고자료

Swift로 구현한 Queue 와 더블스택

0개의 댓글