返回

用队列实现栈 - LeetCode Swift 解题方案

IOS

前言

在计算机科学中,栈是一种先进后出(LIFO)的数据结构,它允许我们在其中添加和删除元素,遵循后入先出的原则。而队列则是一种先进先出(FIFO)的数据结构,元素按照先进来的顺序先被处理。

算法分析

为了利用队列实现栈,我们可以使用两个队列。第一个队列用于存储栈中的元素,第二个队列用于辅助操作。具体实现步骤如下:

  1. 入栈 :当我们需要将一个元素压入栈中时,我们将该元素直接添加到第一个队列的队尾。

  2. 出栈 :当我们需要从栈中弹出元素时,我们将第一个队列的所有元素依次出队并放入第二个队列中,直到第一个队列为空。此时,第二个队列的队首元素就是我们需要出栈的元素,将其出队即可。

  3. 查看栈顶元素 :当我们需要查看栈顶元素时,只需查看第一个队列的队首元素即可。

  4. 判断栈是否为空 :当第一个队列为空时,表明栈为空。

算法实现

class Stack {
    var queue1: [Int] = []
    var queue2: [Int] = []

    func push(_ x: Int) {
        queue1.append(x)
    }

    func pop() -> Int? {
        if queue1.isEmpty {
            return nil
        }

        while queue1.count > 1 {
            queue2.append(queue1.removeFirst())
        }

        let element = queue1.removeFirst()

        while !queue2.isEmpty {
            queue1.append(queue2.removeFirst())
        }

        return element
    }

    func top() -> Int? {
        if queue1.isEmpty {
            return nil
        }

        while queue1.count > 1 {
            queue2.append(queue1.removeFirst())
        }

        let element = queue1.removeFirst()
        queue2.append(element)

        while !queue2.isEmpty {
            queue1.append(queue2.removeFirst())
        }

        return element
    }

    func isEmpty() -> Bool {
        return queue1.isEmpty
    }
}

复杂度分析

  • 时间复杂度:

    • 入栈操作的时间复杂度为 O(1)。
    • 出栈操作的时间复杂度为 O(n),其中 n 为栈中的元素数量。
    • 查看栈顶元素的时间复杂度为 O(n)。
    • 判断栈是否为空的时间复杂度为 O(1)。
  • 空间复杂度:O(n),其中 n 为栈中的元素数量。

总结

利用两个队列实现栈的数据结构,可以让我们在不需要修改栈的底层实现的情况下,使用队列来模拟栈的行为。这种方法虽然增加了时间复杂度,但对于某些特殊场景下仍然非常有用。