代码随想录算法训练营第八天| 232.用栈实现队列 225. 用队列实现栈

文档讲解:代码随想录

视频讲解:代码随想录B站账号

状态:看了视频题解和文章解析后做出来了

232.用栈实现队列

class MyQueue:

    def __init__(self):
        self.stack_in = []
        self.stack_out = []

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

    def pop(self) -> int:
        if self.empty():
            return None

        if self.stack_out:
            return self.stack_out.pop()

        else:
            for i in range(len(self.stack_in)):
                self.stack_out.append(self.stack_in.pop())
            return self.stack_out.pop()

    def peek(self) -> int:
        ans = self.pop()
        self.stack_out.append(ans)
        return ans

    def empty(self) -> bool:
        return not (self.stack_in or self.stack_out)


# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()

思路:此题是使用栈来模拟队列的行为,分别有四个行为需要模拟:1. push入队列 2. pop即出队列 3. peek查看队列下一个要出的元素 4. 查看队列是否为空

使用两个栈来模拟队列的行为,stack_in用来存储进来的元素,一旦执行了pop或peek操作那么stack_out就要接收来自stack_in里存储的值。

这里peek复用了pop的逻辑,避免重复判断逻辑。被peek的值被加入了stack_out栈中,因为如果加入到stack_in中,如果stack_out中此时还有其他值,那么pop就会输出多出的那个值,但实际上应该输出peek的那个值。

只有当两个栈都为空时,此时队列才为空。这里有两种情况:1. 还没开始入元素 2. push和pop被调用了同样的次数。

25. 用队列实现栈

class MyStack:

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

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

    def pop(self) -> int:
        if self.empty():
            return None

        for i in range(len(self.que) - 1):
            self.que.append(self.que.popleft())
        return self.que.popleft()

    def top(self) -> int:
        ans = self.pop()
        self.que.append(ans)
        return ans

    def empty(self) -> bool:
        return not self.que


# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()

思路:使用队列来模拟栈。如果使用上道题的两个队列的方式,会发现其实并没有实现栈的先进后出功能,因为使用队列的方式复制的话顺序其实是一样的,队列也并没有pop的函数所以不可行。

其实还是可以用两个队列来实现这道题,但第二个队列的作用并不是输出,而是将第一个队列里元素进行复制,除了最后一个元素,即我们需要输出pop的元素。

当然也可以像代码中使用一个队列来实现,我们采用原地popleft和append的方式,将队列最后的一个元素移动到队列的第一位,然后popleft输出这个值即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值