剑指offer算法系列——Swift版本

剑指offer—面试题9: 用两个栈实现队列

2020-12-17  本文已影响0人  FY_Chao

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

在Swift中是没有栈的,但我们可以通过用数组实现一个栈,如下面代码:

public struct Stack<T> {
    fileprivate var array = [T]()
    
    public var isEmpty: Bool {
        return array.isEmpty
    }
    
    public var count: Int {
        return array.count
    }
    
    public mutating func push(_ element: T){
        array.append(element)
    }
    
    public mutating func pop() -> T? {
        return array.popLast()
    }
    
    public var top: T? {
        array.last
    }
}

栈的特性在于FILO(先进后出),栈顶的数据总是先弹出来。队列则是FIFO(先进先出)。我们每次往第一个栈里插入元素后,第一个栈的底部元素是最后插入的元素,第一个栈的顶部元素是下一个待删除的元素。为了维护队列先进先出的特性,我们引入第二个栈,用第二个栈维护待删除的元素,在执行删除操作的时候我们首先看下第二个栈是否为空。如果为空,我们将第一个栈里的元素一个个弹出插入到第二个栈里,这样第二个栈里元素的顺序就是待删除的元素的顺序,要执行删除操作的时候我们直接弹出第二个栈的元素返回即可。

下面是代码实现:

class CQueue {

    var stack1 : Stack<Int>
    var stack2 : Stack<Int>
    
    init() {
        stack1 = Stack<Int>()
        stack2 = Stack<Int>()
    }
    
    func appendTail(_ value: Int) {
        stack1.push(value)
    }
    
    func deleteHead() -> Int {
        if stack1.isEmpty && stack2.isEmpty {
            return -1
        }
        
        if stack2.isEmpty {
            while !stack1.isEmpty {
                let temp = stack1.pop()!
                stack2.push(temp)
            }
        }
        
        let res = stack2.pop()!
         
         return res
    }
}
上一篇下一篇

猜你喜欢

热点阅读