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

232.用栈实现队列

力扣题目链接(opens new window)

使用栈实现队列的下列操作:

push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。

class MyQueue:

    def __init__(self):
        """
        in主要负责push,out主要负责pop
        """
        self.stack_in = []
        self.stack_out = []


    def push(self, x: int) -> None:
        """
        有新元素进来,就往in里面push
        """
        self.stack_in.append(x)


    def pop(self) -> int:
        """
        Removes the element from in front of queue and returns that element.
        """
        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:
        """
        Get the front element.
        """
        ans = self.pop()
        self.stack_out.append(ans)
        return ans


    def empty(self) -> bool:
        """
        只要in或者out有元素,说明队列不为空
        """
        return not (self.stack_in or self.stack_out)
  1. __init__(self):初始化方法,创建了两个空栈 stack_in 和 stack_out。stack_in 主要负责 push 操作,stack_out 主要负责 pop 和 peek 操作。

  2. push(self, x: int) -> None:将元素 x 推入队列的操作。这个方法将元素 x 添加到 stack_in 栈顶,实现了 push 操作。

  3. pop(self) -> int:弹出队列的前端元素并返回该元素。首先,它检查队列是否为空,如果为空,则返回 None 表示队列为空。否则,它检查 stack_out 是否为空,如果不为空,则从 stack_out 栈顶弹出元素并返回。如果 stack_out 为空,则将 stack_in 中的元素依次弹出并推入 stack_out,然后从 stack_out 栈顶弹出元素并返回,实现了 pop 操作。

  4. peek(self) -> int:获取队列的前端元素,但不弹出。首先,它调用 pop 方法获取队列前端元素并存储在 ans 中,然后将 ans 推回 stack_out 栈顶,最后返回 ans,实现了 peek 操作。

  5. empty(self) -> bool:检查队列是否为空。如果 stack_in 或 stack_out 中有元素,说明队列不为空,返回 False;否则,返回 True,表示队列为空。

这个队列实现了队列的基本功能,并且通过两个栈来实现队列的 push、pop 和 peek 操作。这种数据结构通常称为两个栈模拟队列。

两个栈模拟队列是一种数据结构设计,通过使用两个栈来模拟队列的行为。这种设计允许你在队列的两端执行操作,即在队列的前端进行 pop 和 peek 操作,而在队列的后端进行 push 操作。下面是对两个栈模拟队列的详细解释:

1. **两个栈**:在两个栈模拟队列中,通常会有两个栈,一个用于入队列操作(push),另一个用于出队列操作(pop 和 peek)。这两个栈分别称为 `stack_in` 和 `stack_out`。

2. **push 操作**:当需要向队列中添加元素时,将元素推入 `stack_in` 栈顶。这个操作与队列的入队列操作类似。

3. **pop 操作**:当需要从队列中移除并返回元素时,可以从 `stack_out` 栈顶弹出元素。但如果 `stack_out` 栈为空,需要执行以下步骤:
    - 从 `stack_in` 栈顶依次弹出元素,并将它们推入 `stack_out` 栈。这个操作会使得元素的顺序反转,从而实现队列的 FIFO(先进先出)行为。
    - 之后,从 `stack_out` 栈顶弹出的元素就是队列的前端元素,它被返回。

4. **peek 操作**:peek 操作用于获取队列的前端元素,但不移除它。可以调用 pop 操作获取前端元素,将它推回 `stack_out` 栈顶,然后返回它。

5. **empty 操作**:用于检查队列是否为空。如果 `stack_in` 和 `stack_out` 均为空,那么队列就为空。

这种两个栈模拟队列的实现方式允许你在队列的前端进行操作,同时保持队列的先进先出特性。虽然这种实现方式在一些情况下可能会涉及元素的多次移动,但它可以有效地模拟队列的行为,并且在某些情况下非常有用。

225. 用队列实现栈

力扣题目链接(opens new window)

使用队列实现栈的下列操作:

  • push(x) -- 元素 x 入栈
  • pop() -- 移除栈顶元素
  • top() -- 获取栈顶元素
  • empty() -- 返回栈是否为空
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:
        # 写法一:
        # if self.empty():
        #     return None
        # return self.que[-1]

        # 写法二:
        if self.empty():
            return None
        for i in range(len(self.que)-1):
            self.que.append(self.que.popleft())
        temp = self.que.popleft()
        self.que.append(temp)
        return temp

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

这段代码实现了一个栈(Stack)的数据结构,使用一个双端队列(deque)来模拟栈的行为。这个栈支持 `push`、`pop`、`top` 和 `empty` 四种操作,以下是对每个方法的详细解释:

1. `__init__(self)`:初始化方法,创建一个空的双端队列 `que`,用于存储栈中的元素。

2. `push(self, x: int) -> None`:将元素 `x` 推入栈的操作。这个方法直接在队列的末尾(右侧)添加元素,模拟了栈的入栈操作。

3. `pop(self) -> int`:弹出栈顶元素并返回。如果栈为空,返回 `None`。具体操作如下:
   - 如果栈不为空,通过循环将队列中除了最后一个元素外的所有元素出队列并入队列,这个操作使得原本在队列头部的元素移到了队列尾部。
   - 然后,弹出队列头部的元素,即栈的顶部元素,返回它。

4. `top(self) -> int`:获取栈顶元素但不弹出。如果栈为空,返回 `None`。具体操作如下:
   - 如果栈不为空,通过循环将队列中除了最后一个元素外的所有元素出队列并入队列,这个操作使得原本在队列头部的元素移到了队列尾部。
   - 然后,将队列头部的元素(栈顶元素)暂时存储在 `temp` 变量中,再将 `temp` 入队列,以恢复原本的队列状态。
   - 最后,返回 `temp`,即栈的顶部元素。

5. `empty(self) -> bool`:检查栈是否为空。如果双端队列 `que` 为空,返回 `True`,表示栈为空;否则返回 `False`,表示栈不为空。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值