Swift 实现栈和队列

Swift语言中没有内设的栈和队列, 可通过数组或链表模拟栈和队列(链表的加入和删除的时间复杂度是O(1),但因为Swift没有现成的链表,而数组又有很多的API可以直接使用,所以下面用数组实现)

  • 栈是后进先出的结构。你可以理解成有好几个盘子要垒成一叠,哪个盘子最后叠上去,下次使用的时候它就最先被抽出去
  • 在iOS开发中,如果你要在你的App中添加撤销操作(比如删除图片,恢复删除图片),那么栈是首选数据结构
  • 几个基本操作:push、pop、isEmpty、peek、size

队列

  • 队列是先进先出的结构。这个正好就像现实生活中排队买票,谁先来排队,谁先买到票
  • iOS开发中多线程的GCD和NSOperationQueue就是基于队列实现的
  • 几个基本操作:enqueue、dequeue、isEmpty、peek、size

playground 代码实现

// 栈
class Stack<Element> {
    var stack:[Element]
    
    /// 检查栈空
    var isEmpty:Bool { return stack.isEmpty}
    
    /// 栈顶元素
    var peek: Element {return stack.last!}
    
    /// 栈大小
    var size: Int {return stack.count}
    
    /// 初始化
    init(){
        stack = [Element]()
    }
    
    /// push 压入
    func push(obejct:Element){
        stack.append(obejct)
    }
    
    /// pop 弹出
    func pop() -> Element? {
        return stack.popLast()
    }
    
    func print(){
        Swift.print("Stack = \(stack)")
    }
}

// 队列
var myStack:Stack = Stack<Any>()

myStack.push(obejct: "1")
myStack.push(obejct: "2")
myStack.push(obejct: "3")

myStack.print()

myStack.pop()

myStack.print()

class Queue<Element> {
    var left:[Element]
    var right:[Element]
    /// 队列是否为空
    var isEmpty:Bool { return left.isEmpty && right.isEmpty }
    /// 队列长度
    var size:Int { return left.count + right.count }
    /// 队列顶元素
    var peek : Element? {return left.isEmpty ? left.first : right.last}
    
    init(){
        left = [Element]()
        right = [Element]()
    }
    
    /// 入队
    func enqueue(object: Element){
        right.append(object)
    }
    
    /// 出队
    func dequeue() -> Element? {
        if left.isEmpty {
            left = right.reversed()
            right.removeAll()
        }
        
        return left.popLast()
    }
    
    func print(){
        let tempQ = left.reversed()+right
        Swift.print("Queue = \(tempQ)")
    }
}

var myQueue = Queue<Any>()
myQueue.enqueue(object: "1")
myQueue.enqueue(object: "2")
myQueue.enqueue(object: "3")

myQueue.print()

myQueue.dequeue()
myQueue.print()
myQueue.enqueue(object: "4")
myQueue.print()
myQueue.dequeue()
myQueue.print()

Stack = ["1", "2", "3"]
Stack = ["1", "2"]
Queue = ["1", "2", "3"]
Queue = ["2", "3"]
Queue = ["2", "3", "4"]
Queue = ["3", "4"]