-
Notifications
You must be signed in to change notification settings - Fork 84
/
Copy pathStack.swift
104 lines (91 loc) · 2.9 KB
/
Stack.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
* The MIT License (MIT)
*
* Copyright (C) 2019, CosmicMind, Inc. <http://cosmicmind.com>.
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
public struct Stack<Element>: CustomStringConvertible, Sequence {
public typealias Iterator = AnyIterator<Element>
/// Underlying data structure.
private var list: DoublyLinkedList<Element>
/// Total number of items in the Stack.
public var count: Int {
return list.count
}
/// Get the latest element at the top of the Stack and do not remove it.
public var top: Element? {
return list.front
}
/// A boolean of whether the Stack is empty.
public var isEmpty: Bool {
return list.isEmpty
}
/// Conforms to the Printable Protocol.
public var description: String {
return list.description
}
/// Initializer.
public init() {
list = DoublyLinkedList<Element>()
}
/**
Conforms to the SequenceType Protocol. Returns the next value in the
sequence of nodes.
- Returns: Stack.Generator
*/
public func makeIterator() -> Stack.Iterator {
return list.makeIterator()
}
/**
Insert a new element at the top of the Stack.
- Parameter _ element: An Element type.
*/
mutating public func push(_ element: Element) {
list.insert(atFront: element)
}
/**
Get the latest element at the top of the Stack and remove it from
the Stack.
- Returns: Element?
*/
mutating public func pop() -> Element? {
return list.removeAtFront()
}
/// Remove all elements from the Stack.
mutating public func removeAll() {
list.removeAll()
}
}
public func +<Element>(lhs: Stack<Element>, rhs: Stack<Element>) -> Stack<Element> {
var s = Stack<Element>()
for x in lhs {
s.push(x)
}
for x in rhs {
s.push(x)
}
return s
}
public func +=<Element>(lhs: inout Stack<Element>, rhs: Stack<Element>) {
for x in rhs {
lhs.push(x)
}
}