FIFO
먼저 들어간 것이 먼저 나온다
struct Queue<T> {
var elements = [T]()
mutating func enqueue(_ element: T) {
self.elements.append(element)
}
mutating func dequeue() -> T? {
return self.elements.removeFirst()
}
func peek() -> T? {
return self.elements.first
}
func isEmpty() -> Bool {
return elements.isEmpty
}
func count() -> Int {
return elements.count
}
}
extension Queue: CustomStringConvertible, CustomDebugStringConvertible {
public var description: String {
return self.elements.description
}
public var debugDescription: String {
return self.elements.debugDescription
}
}
extension Queue: ExpressibleByArrayLiteral {
public init(arrayLiteral elements: T...) {
self.init(elements)
}
public init<S: Sequence>(_ elements: S) where S.Iterator.Element == T {
self.elements.append(contentsOf: elements)
}
}
var queue: Queue<Int> = [1,2,3]
struct QueueIterator<T>: IteratorProtocol {
var currentElement: [T]
mutating func next() -> T? {
if !self.currentElement.isEmpty {
// 큐는 첫번째 부터 반환해야 하기에 removeFirst() 사용
// 스택은 popLast()
return currentElement.removeFirst()
} else {
return nil
}
}
}
extension Queue: Sequence {
func makeIterator() -> QueueIterator<T> {
return QueueIterator(currentElement: self.elements)
}
}
var queue: Queue<Int> = [1,2,3,4,5]
for q in queue {
print(q)
}
extension Queue {
private func checkIndex(index: Int) {
if index < 0 || index > count {
fatalError("Index out of range")
}
}
}
extension Queue: MutableCollection {
var startIndex: Int {
return 0
}
var endIndex: Int {
return count - 1
}
func index(after i: Int) -> Int {
return elements.index(after: i)
}
subscript(index: Int) -> T {
get {
checkIndex(index: index)
return self.elements[index]
}
set {
checkIndex(index: index)
elements[index] = newValue
}
}
}
책
스위프트 고급 데이터 구조의 활용- 프로토콜 지향 큐 구현하기-씩이