Add a basic Queue data structure
Implemented as a linked list.
This commit is contained in:
parent
4e4b6b9bca
commit
47df42c8e5
4 changed files with 117 additions and 4 deletions
|
@ -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
54
Terrain2/Queue.swift
Normal 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
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue