📜  数据结构|堆叠问题8(1)

📅  最后修改于: 2023-12-03 15:40:01.224000             🧑  作者: Mango

数据结构|堆叠问题8

问题详情

有一个栈和两个队列,实现一个数据结构,支持以下操作:

  • push(x): 将元素 x 压入栈顶
  • pop(): 移除并返回栈顶元素
  • top(): 返回栈顶元素
  • empty(): 判断栈是否为空
解决方案

我们可以使用两个队列 q1 和 q2 来模拟栈,分别存储栈中的元素。其中一个队列始终为空,另一个队列用来存储栈中的元素。

  • push(x): 将元素压入非空队列,使其成为队尾。如果两个队列都为空,则默认将元素压入 q1 中。

  • pop(): 将非空队列中的前 n-1 个元素依次移动到空队列中,只剩下最后一个元素,即为栈顶元素。弹出该元素并返回。

  • top(): 将非空队列中的前 n-1 个元素依次移动到空队列中,只剩下最后一个元素,即为栈顶元素。返回该元素。

  • empty(): 如果 q1 和 q2 都为空,则表示栈为空。否则栈不为空。

具体实现代码如下:

class MyStack:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.q1 = []
        self.q2 = []

    def push(self, x: int) -> None:
        """
        Push element x onto stack.
        """
        if not self.q2:
            self.q1.append(x)
        else:
            self.q2.append(x)

    def pop(self) -> int:
        """
        Removes the element on top of the stack and returns that element.
        """
        if self.q1:
            while len(self.q1) > 1:
                self.q2.append(self.q1.pop(0))
            return self.q1.pop(0)
        else:
            while len(self.q2) > 1:
                self.q1.append(self.q2.pop(0))
            return self.q2.pop(0)

    def top(self) -> int:
        """
        Get the top element.
        """
        if self.q1:
            while len(self.q1) > 1:
                self.q2.append(self.q1.pop(0))
            res = self.q1.pop(0)
            self.q2.append(res)
        else:
            while len(self.q2) > 1:
                self.q1.append(self.q2.pop(0))
            res = self.q2.pop(0)
            self.q1.append(res)
        return res

    def empty(self) -> bool:
        """
        Returns whether the stack is empty.
        """
        return not self.q1 and not self.q2
复杂度分析

时间复杂度:

  • push(): O(1)
  • pop(): O(n)
  • top(): O(n)
  • empty(): O(1)

空间复杂度:O(n)

由于我们需要两个队列来维护栈,所以空间复杂度为 O(n),其中 n 为栈中元素个数。