代码随想录算法训练营第9天—栈与队列01 | ● 理论基础 ● 232.用栈实现队列 ● *225. 用队列实现栈

理论基础

  • 见我的另一篇文章

232.用栈实现队列

题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html

  • 考点
    • 栈的基本操作
  • 我的思路
  • 视频讲解关键点总结
    • 用两个栈stack_in和stack_out分别实现入队列和出队列的操作
    • 入队列直接入栈stack_in
    • 出队列时,将stack_in里的元素全部压入stack_out,之后stack_out.pop()
    • 获取队列首元素时复用出队列的函数,但是记得将出队列的那个元素加回去
    • 判断队列是否为空时,判断stack_in和stack_out是否有一个不为空,只要有,则队列不是空
  • 我的思路的问题
  • 代码书写问题
    • 在出队列函数中,应该等到stack_out中的元素全部被弹出后,再继续把stack_in里的元素压入,否则将导致乱序
  • 可执行代码
class MyQueue(object):

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

    def push(self, x):
        """
        :type x: int
        :rtype: None
        """
        self.stack_in.append(x)

    def pop(self):
        """
        :rtype: int
        """
        if self.empty():
            return None
        if self.stack_out:
            return self.stack_out.pop()
        else:
            while self.stack_in:
                self.stack_out.append(self.stack_in.pop())
            return self.stack_out.pop()


    def peek(self):
        """
        :rtype: int
        """
        peak = self.pop()
        self.stack_out.append(peak)
        return peak


    def empty(self):
        """
        :rtype: bool
        """
        if self.stack_out or self.stack_in:
            return False
        else:
            return True

*225. 用队列实现栈

题目链接/文章讲解/视频讲解:https://programmercarl.com/0225.%E7%94%A8%E9%98%9F%E5%88%97%E5%AE%9E%E7%8E%B0%E6%A0%88.html

  • 考点
    • 队列的基本操作
  • 我的思路
    • 依旧使用和上一题类似的思路,用两个队列实现栈
  • 视频讲解关键点总结
    • 用一个队列实现栈
    • 这是因为在pop时,队列pop出来的元素可以直接加入队列末尾,而栈不行,因此此时只需要使用一个队列就能模拟栈的pop
      • 先把队列里除了最后一个元素以外的所有元素弹出并添加到队列的末尾
      • 之后弹出最后一个元素并返回
    • python里,因为queue里的Queue类没有取头尾元素的功能,因此推荐使用双向队列类deque,具体操作见上述链接(如果使用列表模拟的话,在pop(0)的时候时间复杂度为O(n),影响算法性能)
  • 我的思路的问题
    • 没有做到最优
  • 代码书写问题
    • 二刷需要熟悉一下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]

        # 写法二:
        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

你可能感兴趣的:(Leetcode,代码随想录(Python),算法,python,开发语言)