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

目录

  • 栈和队列
  • 232. 用栈实现队列
    • 思路
    • 代码
    • 复杂度分析
  • 225. 用队列实现栈
    • 思路
    • 代码
    • 复杂度分析

栈和队列

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

如图所示:
代码随想录算法训练营第十天 | 栈和队列 part 1_第1张图片

232. 用栈实现队列

Leetcode

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

思路

具体参考卡哥写的文章:

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

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

执行语句:
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

使用单项队列
代码随想录算法训练营第十天 | 栈和队列 part 1_第3张图片

思路

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

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

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)

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