Code

// 0
func example(str: String, isAction: Bool = true, action: () -> Void) {
    print("---------\(str), isAction: \(isAction)---------")
    
    if isAction {
        action()
    }
}

// 1
struct Queue<T> {
    fileprivate var data: [T] = [T]()
    public init() {}
    
    public init<S: Sequence>(_ elements: S) where S.Iterator.Element == T  {
        data.append(contentsOf: elements)
    }
    
    mutating func enqueue(element: T)  {
        data.append(element)
    }
    
    mutating func dequeue() -> T? {
        return data.removeFirst()
    }
    
    mutating func peek() -> T? {
        return data.first
    }
    
    mutating func clear() {
        data.removeAll()
    }
    
    public var count: Int {
        return data.count
    }
    
    public var capacity: Int {
        get {
            return data.capacity
        }set {
            return data.reserveCapacity(newValue)
        }
    }
    
    var isFull: Bool {
        return data.capacity == data.count
    }
    
    var isEmpty: Bool {
        return data.isEmpty
    }
}

// 2
extension Queue: CustomStringConvertible, CustomDebugStringConvertible {
    
    public var description: String {
        return self.data.description
    }
    
    public var debugDescription: String {
        return self.data.debugDescription
    }
}

// 3
extension Queue: ExpressibleByArrayLiteral {
    public init(arrayLiteral elements: T...) {
        data = elements
    }
}

// 4
extension Queue: Sequence {
    func makeIterator() -> AnyIterator<T> {
        return AnyIterator(IndexingIterator(_elements: data.lazy))
    }
}

// 5
example(str: "Queue") {
    var q1: Queue<Int> = [1,2,3,4,5]
    var q2 = Queue<Int>()
    q1.dequeue()
    print(q1)
    print(q2)
    
    q2.enqueue(element: 55)
    for el in q1 {
        print(el)
    }
    
    q1.clear()
    print(q1)
}

큐는 먼저 입력된 데이터가 먼저 출력되는 FIFO(first in First Out) 데이터 구조를 나타냅니다.

전체 코드 주소


Reference

swift-algorithm-club/Queue