秋招算法备战第10天 | 栈与队列理论基础、232.用栈实现队列、225. 用队列实现栈

栈与队列理论基础

Summary
本文介绍了栈和队列在STL(C++标准库)中的基本概念和实现原理。栈和队列都属于STL中的容器适配器,其底层实现可以使用不同的容器,如vector、deque和list。

Facts
栈和队列是STL(C++标准库)中的两个数据结构,属于容器适配器。
STl有多个版本,包括HP STL、P.J.Plauger STL和SGI STL。
栈的特点是先进后出,提供push和pop等接口,底层实现可以是vector、deque或list。
SGI STL中栈的缺省底层实现是deque。
队列的特点是先进先出,底层实现也可以是vector、deque或list。
SGI STL中队列的缺省底层实现是deque。
使用其他编程语言时,也要考虑栈和队列的底层实现,深入了解其内部原理。

232. 用栈实现队列 - 力扣(Leetcode)

时间不够,直接阅读的标准代码,具体如下

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)

下面是GPT4对上述代码的解释

这段代码定义了一个名为 MyQueue 的类,它用两个栈(即 “stack_in” 和
“stack_out”)来模拟队列的行为。队列是一种数据结构,其中的元素以先进先出(FIFO)的顺序被添加和删除,而栈是一种数据结构,其中的元素以后进先出(LIFO)的顺序被添加和删除。

现在让我们更深入地分析每个方法:

  1. __init__方法是类的初始化方法,它在创建类的新实例时被调用。这里,它用于初始化两个空栈: “stack_in” 和 “stack_out”。

  2. push方法用于将元素添加到队列的末尾,对应的是栈 “stack_in” 的 push 操作。

  3. pop方法用于从队列的前端移除并返回一个元素。首先,它会检查队列是否为空,如果为空,则返回 None。如果不为空,然后它会检查 “stack_out” 是否为空。如果 “stack_out” 不为空,则从中 pop 出一个元素;如果 “stack_out”
    为空,那么它会将 “stack_in” 中的所有元素 pop 出来并 push 到 “stack_out” 中,然后从
    “stack_out” 中 pop 出一个元素。

  4. peek方法用于获取队列前端的元素,但不删除它。它通过调用 pop 方法并将结果立即 push 回 “stack_out” 来实现这一点。

  5. empty方法检查队列是否为空。如果 “stack_in” 或 “stack_out” 中至少有一个元素,则队列不为空。

通过这种方式,这个类成功地使用两个栈来模拟队列的行为。尽管这可能不如直接使用队列那样直观或效率高,但这是一个常见的计算机科学问题和面试问题,用来测试候选人对数据结构和算法的理解。

225. 用队列实现栈 - 力扣(Leetcode)

时间不够,直接阅读的标准代码,具体如下

from collections import deque

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]

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

下面是GPT4对上述代码的解释

这段代码定义了一个名为 MyStack的类,它使用一个队列(deque)来模拟栈的行为。
栈是一种数据结构,其中元素以后进先出(LIFO)的顺序被添加和删除,而队列是一种数据结构,其中元素以先进先出(FIFO)的顺序被添加和删除。
在Python 中,collections.deque 是一个双端队列,可以在两端进行元素的添加和删除操作。

现在让我们详细解释每个方法:

  1. __init__方法是类的构造函数,它在创建新的类实例时被调用。这里,它用于初始化一个空的双端队列。

  2. push方法用于将元素添加到栈顶,对应的是队列的尾部添加操作。

  3. pop方法用于从栈顶移除并返回一个元素。首先,它会检查栈是否为空,如果为空,则返回 None。如果栈不为空,那么它会将队列前面的元素移动到队列尾部,直到只剩下最后添加的元素,然后移除并返回该元素。

  4. top方法用于获取栈顶的元素,但不删除它。如果栈为空,返回 None;否则,返回队列的最后一个元素(即栈顶元素)。

  5. empty方法用于检查栈是否为空。如果队列为空,则栈为空。

通过这种方式,该类成功地使用一个队列来模拟栈的行为。尽管这可能不如直接使用栈那样直观或效率高,但这是一个常见的计算机科学问题和面试问题,用来测试候选人对数据结构和算法的理解。

总结

两个栈可以实现队列,一个双端队列可以实现栈(from collections import deque)

附录

代码随想录算法训练营第十天 | 232. 用栈实现队列、225. 用队列实现栈_小蛙先森的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值