Add a basic Queue data structure

Implemented as a linked list.
This commit is contained in:
Eryn Wells 2018-11-10 17:40:37 -05:00
parent 4e4b6b9bca
commit 47df42c8e5
4 changed files with 117 additions and 4 deletions

View file

@ -222,11 +222,11 @@ public class DiamondSquareGenerator: TerrainGenerator {
}
func breadthFirstSearch(visit: (Box) -> (Void)) {
var queue = [self]
while queue.count > 0 {
let box = queue.removeFirst()
var queue = Queue<Box>()
queue.enqueue(item: self)
while let box = queue.dequeue() {
visit(box)
queue.append(contentsOf: box.subdivisions)
queue.enqueue(items: box.subdivisions)
}
}
}

54
Terrain2/Queue.swift Normal file
View file

@ -0,0 +1,54 @@
//
// Queue.swift
// Terrain2
//
// Created by Eryn Wells on 11/10/18.
// Copyright © 2018 Eryn Wells. All rights reserved.
//
import Foundation
struct Queue<Element> {
class Node<Element> {
var item: Element
var next: Node?
init(item i: Element) {
item = i
}
}
var count: Int = 0
var head: Node<Element>?
var tail: Node<Element>?
mutating func enqueue(item: Element) {
let newNode = Node(item: item)
if head == nil {
head = newNode
tail = newNode
} else {
tail!.next = newNode
tail = newNode
}
count += 1
}
mutating func enqueue<S>(items: S) where Element == S.Element, S : Sequence {
for i in items {
enqueue(item: i)
}
}
mutating func dequeue() -> Element? {
guard let oldHead = head else {
return nil
}
head = oldHead.next
if head == nil {
tail = nil
}
count -= 1
return oldHead.item
}
}