题解 | #用两个栈实现队列#

用两个栈实现队列

https://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6?tpId=13&tqId=23281&ru=/exam/oj/ta&qru=/ta/coding-interviews/question-ranking&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D13%26type%3D13

class Solution:
    def __init__(self):
        self.stack1 = []
        self.stack2 = []

    def push(self, node):
        self.stack1.append(node)

    def pop(self):
        if len(self.stack2) == 0:
            # while len(self.stack1) > 0:
            #     self.stack2.append(self.stack1.pop())
            self.stack1.reverse()
            self.stack2 = self.stack1
            self.stack1 = []
        return self.stack2.pop()

题解思路

Python 里栈可以用列表 list 实现。

用两个列表模拟队列:

插入时用栈 1;

弹出时,先把栈 1 的元素挨个弹出到栈 2 中(使用列表的 pop)。这样一来最先进入栈 1 的元素就到了栈 2 的末端,只需要弹出栈 2 的末端元素,对应着队列的先进先出。

关于时间复杂度

插入自然是 O(1)

弹出乍看是 O(n) 的,但实际上每个元素都最多只会插入、弹出栈 2 一次。平均下来,每次弹出元素是 O(1) 的时间复杂度。

吸收

  • 一种新的时间复杂度分析思路。
  • “把栈 1 的元素挨个弹出到栈 2 中”这一步操作时,Python 可以直接使用 stack1.reverse() 进行列表反转。注意这一步是 in-place 操作,没有返回值。然后把 stack1 赋值给 stack2,stack1 设为空

全部评论

相关推荐

点赞 评论 收藏
分享
被普调的六边形战士很高大:项目经历貌似和专业或者求职方向没大关系?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务