Day 10| 232.用栈实现队列 、 225. 用队列实现栈

232.用栈实现队列

大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.用栈实现队列.html

思考

两个栈,栈1用于入队列,栈2用于出队列,栈2为空时,如果要出队列,把栈1的元素逐个弹出到栈2,保证栈2的顶部,永远时最早入队的元素。

class MyQueue:

    def __init__(self):
        self.stack1 = []
        self.stack2 = []
    def push(self, x: int) -> None:
        self.stack1.append(x)

    def pop(self) -> int:
        if self.stack2:
            return self.stack2.pop()
        else:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
            return self.stack2.pop()

    def peek(self) -> int:
        if self.stack2:
            return self.stack2[-1]
        else:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
            return self.stack2[-1]    

    def empty(self) -> bool:
        return self.stack1 == [] and self.stack2 == []

225. 用队列实现栈 - [ ]

可以大家惯性思维,以为还要两个队列来模拟栈,其实只用一个队列就可以模拟栈了。

建议大家掌握一个队列的方法,更简单一些,可以先看视频讲解

题目链接/文章讲解/视频讲解:https://programmercarl.com/0225.用队列实现栈.html

思考

1、两个队列实现栈,队列1入栈,队列2临时保存队列1出队的元素。每出栈一次,队列1和队列2互换,有元素的当队列1,好理解一点。
2、python用deque (双端队列)

from collections import deque
class MyStack:

    def __init__(self):
        self.deque1 = deque()
        self.deque2 = deque()

    def push(self, x: int) -> None:
        self.deque1.append(x)

    def pop(self) -> int:
        if len(self.deque1) == 0:
            self.deque1,self.deque2 = self.deque2,self.deque1
        size = len(self.deque1)
        while size-1:
            self.deque2.append(self.deque1.popleft())
            size-=1
        return self.deque1.popleft()

    def top(self) -> int:
        res = self.pop()
        if len(self.deque1) == 0:
            self.deque1,self.deque2 = self.deque2,self.deque1 
            self.deque1.append(res)
        return res

    def empty(self) -> bool:
        return len(self.deque1) ==0 and len(self.deque2) ==0

进阶

用1个队列实现栈。从上面的代码可以看到,队列操作的元素顺序没有发生变化。可以用一个队列实现栈,想想一下有个排队的队列,出栈时是需要出队尾元素的,假设队列长度为n,这时把前n-1个元素逐个出队再入队。相当于本来排前面的人,仍然按照顺序站在最后一个人的后面排队。队尾的人自然成为第一个人,pop出去。

from collections import deque
class MyStack:

    def __init__(self):
        self.deque1 = deque()

    def push(self, x: int) -> None:
        self.deque1.append(x)

    def pop(self) -> int:
        size = len(self.deque1)
        while size-1:
            self.deque1.append(self.deque1.popleft())
            size-=1
        return self.deque1.popleft()

    def top(self) -> int:
        res = self.pop()
        self.deque1.append(res)
        return res

    def empty(self) -> bool:
        return len(self.deque1) ==0 
posted @ 2024-06-01 00:18  forrestr  阅读(36)  评论(0)    收藏  举报