代码随想录算法训练营第十天 | 栈和队列 part 1

栈和队列

队列是先进先出,栈是先进后出。

如图所示:
在这里插入图片描述

232. 用栈实现队列

Leetcode

在这里插入图片描述

思路

具体参考卡哥写的文章:

使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈和输出栈的关系。

下面动画模拟以下队列的执行过程:

执行语句:
queue.push(1);
queue.push(2);
queue.pop(); 注意此时的输出栈的操作
queue.push(3);
queue.push(4);
queue.pop();
queue.pop();注意此时的输出栈的操作
queue.pop();
queue.empty();

请添加图片描述

  • push: 只要数据放进输入栈就好
  • pop: 输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。
  • empty: 如果进栈和出栈都为空的话,说明模拟的队列为空了。

代码

class MyQueue:

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

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

    def pop(self) -> int:
        """
        Removes the element from in front of queue and returns that element.
        """
        if self.stackOut:
            ans = self.stackOut.pop()
        else:
            while self.stackIn:
                self.stackOut.append(self.stackIn.pop())
            ans = self.stackOut.pop()
        return ans


    def peek(self) -> int:
        # if self.stackOut:
        #     ans = self.stackOut.pop()
        #     self.stackOut.append(ans)
        # else:
        #     while self.stackIn:
        #         self.stackOut.append(self.stackIn.pop())
        #     ans = self.stackOut.pop()
        #     self.stackOut.append(ans)

        # 使用刚刚定义的function会更简单
        ans = self.pop()
        self.stackOut.append(ans)
        
        return ans

    def empty(self) -> bool:
        """
        只要in或者out有元素,说明队列不为空
        """
        return not (self.stackIn or self.stackOut)

复杂度分析

  • 时间复杂度:pushemptyO(1), poppeekO(n)
  • 空间复杂度:O(n)

225. 用队列实现栈

Leetcode

使用单项队列
在这里插入图片描述

思路

两个队列。一个是主队列,一个是备份队列。

模拟的队列执行语句如下:

queue.push(1);        
queue.push(2);        
queue.pop();   // 注意弹出的操作       
queue.push(3);        
queue.push(4);       
queue.pop();  // 注意弹出的操作    
queue.pop();    
queue.pop();    
queue.empty();    

请添加图片描述

代码

from collections import deque
class MyStack:

    def __init__(self):
        self.mainQueue = deque()
        self.subQueue = deque()

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

    def pop(self) -> int:
        while len(self.mainQueue) > 1:
            self.subQueue.append(self.mainQueue.popleft())
        
        ans = self.mainQueue.pop()
        while self.subQueue:
            self.mainQueue.append(self.subQueue.popleft())
        
        return ans

    def top(self) -> int:
        """
        1. 首先确认不空
        2. 我们仅有in会存放数据,所以返回第一个即可
        """
        # ans = self.pop()
        # self.push(ans)
        # return ans

        return self.mainQueue[-1]

    def empty(self) -> bool:
        """
        因为只有in存了数据,只要判断in是不是有数即可
        """
        # return not(self.mainQueue or self.subQueue)
        return len(self.mainQueue) == 0

复杂度分析

  • 时间复杂度:pop和为O(n), 其他为O(1)
  • 空间复杂度:O(n)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值