美文网首页
swift用队列实现栈

swift用队列实现栈

作者: 前年的邂逅_Jerry | 来源:发表于2019-10-16 23:22 被阅读0次

class ViewController: UITableViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        var stack = MyStack()
        stack.push(1)
        stack.push(2)
        stack.push(3)
        stack.push(4)
        stack.push(5)
        stack.push(6)
        stack.push(7)
        
        print(stack.peek)
        print(stack.peek)
        print(stack.pop())
        print(stack.peek)
        print(stack.pop())
    }
}

struct MyStack {
    var queueA = MyQueue()
    var queueB = MyQueue()
    
    var size : Int{return queueA.size}
    
    var isEmpty : Bool{return queueA.isEmpty}
    //将要出栈的元素
    var peek : Int?{
        mutating get{
            shift()
            if let element = queueA.peek{
                queueA.dequeue()
                queueB.enqueue(element)
                swap()
                return element
            }else{
                return nil
            }
        }
    }
    mutating func push(_ val : Int){
        queueA.enqueue(val)
    }
    mutating func pop() -> Int?{
        shift()
        swap()
        return queueB.dequeue()
    }
    mutating func shift(){
        while queueA.size != 1 {
            if let element = queueA.dequeue(){
                queueB.enqueue(element)
            }
        }
    }
    mutating func swap(){
        (queueA , queueB) = (queueB , queueA)
    }
}

protocol Queue {
    associatedtype Element
    
    var isEmpty : Bool{get}
    var size : Int{get}
    var peek : Int?{get}
    //入队
    mutating func enqueue(_ val : Element)
    //出队
    mutating func dequeue() -> Element?
}

struct MyQueue : Queue {
    
    typealias Element = Int
    
    var left = [Element]()
    var right = [Element]()
    var peek : Element?{
        return left.isEmpty ? right.last : left.first
    }
    var isEmpty : Bool{return left.isEmpty && right.isEmpty}
    var size : Int{return left.count + right.count}
    //入队
    mutating func enqueue(_ val : Element){
        left.append(val)
    }
    //出队
    mutating func dequeue() -> Element?{
        if left.isEmpty{
            
        }else{
            while (!left.isEmpty){
                if let element = left.popLast(){
                    right.append(element)
                }
            }
        }
        return right.popLast()
    }
}

相关文章

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • leecode刷题(26)-- 用栈实现队列

    leecode刷题(26)-- 用栈实现队列 用栈实现队列 使用栈实现队列的下列操作: push(x) -- 将一...

  • C语言第七次作业:链表

    707. 设计链表 空指针 空节点 225. 用队列实现栈 链式存储栈 双队列实现栈 232. 用栈实现队列 链式...

  • swift用队列实现栈

  • swift用栈实现队列

  • iOS开发集锦之 2017.03.30(Swift 算法实战之路

    1. Swift 算法实战之路:栈和队列 作者: 故胤道长描述:栈和队列的基本Swift实现,以及在iOS开发中应...

  • 队列之-队列实现栈

    一、队列实现栈核心算法概述 之前已经描述过了用栈实现队列的功能,见栈系列之-实现队列,那么同样队列也可以用来实现栈...

  • 38_两个有趣的问题

    关键词:通过栈实现队列、通过队列实现栈 0. 通过栈实现队列 用栈实现队列等价于用后进先出的特性实现先进先出的特性...

  • 栈&队列

    一、栈&队列总结 栈/队列的应用接雨水验证栈序列滑动窗口的最大值 栈/队列的特殊实现用两个栈实现队列用两个队列实现...

  • Swift 数据结构与算法实现

    用 Swift 实现了 Trie 字典树、并查集、堆和优先队列、哈希表、红黑树、集合与映射、链表、数组、栈、队列、...

网友评论

      本文标题:swift用队列实现栈

      本文链接:https://www.haomeiwen.com/subject/wippmctx.html