I already described Stack and Queue data structures and how to implement them in Swift in my
previous post about stack and queue. There I used class (reference type) for implementing stack and queue, also I used them for resolve task for define that string is
palindrome.
Now let's update our implementation, for now let's use struct (value type) because it is always preferable to use struct(value type) if it no need for class features (like inheritance for example).
Non generic implementation (only for Int type)
Stack Implementation
// LIFO - Last In First Out
struct Stack {
var array: [Int] = []
var isEmpty: Bool {
return array.isEmpty
}
// add new element to the stack
mutating func push(_ element: Int) {
array.append(element)
}
// get the last element from the stack and remove it form stack
mutating func pop() -> Int? {
if !isEmpty {
let value = array.removeLast()
return value
}
return nil
}
// get the head of stack - the last element
mutating func peek() -> Int? {
if !isEmpty {
let value = array.last
return value
}
return nil
}
}
Queue Implementation
// FIFO - First In First Out
struct Queue {
var array: [Int] = []
var isEmpty: Bool {
return array.isEmpty
}
// add new element to queue
mutating func enqueue(_ element: Int) {
array.append(element)
}
// get the first element and remove it from queue
mutating func dequeue() -> Int? {
if !isEmpty {
let value = array.removeFirst()
return value
}
return nil
}
// get the head of queue - the first element
mutating func peek() -> Int? {
if !isEmpty {
let value = array.first
return value
}
return nil
}
}
Here example of adding randomly generated integer number to stack and queue.
var stack = Stack()
var queue = Queue()
let randomNumer = Int(arc4random_uniform(100))
stack.push(randomNumer)
queue.enqueue(randomNumer)
Generic Implementation
But it is always useful to write universal solutions for our tasks. So let's implement generic versions of stack and queue.
Stack Implementation
// LIFO - Last In First Out
struct Stack<T> {
var array: [T] = []
var isEmpty: Bool {
return array.isEmpty
}
// add new element to the stack
mutating func push(_ element: T) {
array.append(element)
}
// get the last element from the stack and remove it form stack
mutating func pop() -> T? {
if !isEmpty {
let value = array.popLast()
return value
}
return nil
}
// get the head of stack - the last element
func peek() -> T? {
if !isEmpty {
let value = array.last
return value
}
return nil
}
}
Queue Implementation
// FIFO - First In First Out
struct Queue<T> {
var array: [T] = []
var isEmpty: Bool {
return array.isEmpty
}
// add new element to queue
mutating func enqueue(_ element: T) {
array.append(element)
}
// get the first element and remove it from queue
mutating func dequeue() -> T? {
if !array.isEmpty {
let value = array.removeFirst()
return value
}
return nil
}
// get the head of queue - the first element
mutating func peek() -> T? {
if !array.isEmpty {
let value = array.first
return value
}
return nil
}
}
Now we can easily use stack for any type we need. For Integer:
var stack = Stack<Int>()
var queue = Queue<Int>()
let randomNumer = Int(arc4random_uniform(100))
stack.push(randomNumer)
queue.enqueue(randomNumer)
Or for String
var stack = Stack<String>()
var queue = Queue<String>()
Or even for Any, in this case we can add to stack and queue String and Integer both.
var stack = Stack<Any>()
var queue = Queue<Any>()
Demo Application
Stack and Queue before the values are obtained from them
Stack and Queue after the values are obtained from them
Source Code
Source code for demo app can be found on GitHub:
Stack vs Queue Demo App
Your article is one of its kind which explained every bit of Custom Build Website. looking for further valuable articles from you
ReplyDeleteYou've written a pretty interesting article. I was on the lookout for information like this. Please share more related information with me so that I can learn more. Best Custom Websites
ReplyDeleteThank you Sir, you made it easy as pie. Now i am able to understand and have enough knowledge about this. It is only because of you.
ReplyDeleteCustom Designed Websites
Thanks to your article now I understand or learn many new things which are very difficult to understand the way you describe this topic is very easy to understand. Web Design USA
ReplyDeleteYour article is one of its kind which explained every bit of Custom Build Website. looking for further valuable articles from you
ReplyDeleteMobile Performance Meter Hack
Thank you so much for your post; it has given us a terrific idea.
ReplyDeleteSEO Firm USA