本文介绍: 232.用栈实现队列(栈基本操作)● *225. 用队列实现栈(队列基本操作,deque双向队列类)

理论基础

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

原文地址:https://blog.csdn.net/weixin_45055622/article/details/136029498

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_66859.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注