代码随想录算法训练营Day10 | 栈与队列理论基础、LeetCode232 用栈实现队列、LeetCode225 用队列实现栈

Posted by 慕念 on March 1, 2024

栈与队列理论基础

文章讲解:https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html

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

栈与队列理论1

LeetCode232 用栈实现队列

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

⭐2个栈模拟队列

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

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

232.用栈实现队列版本2

在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。

最后如何判断队列为空呢?如果进栈和出栈都为空的话,说明模拟的队列为空了。

class MyQueue(object):

    def __init__(self):
        self.stack_in = []  # 入栈,push
        
        self.stack_out = [] # 出栈,pop
        

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


    def pop(self):
        """
        :rtype: int
        """
        if not self.stack_out:  # 出栈为空
            
            while self.stack_in:    # 当入栈不为空时,全部复制到出栈
                
                self.stack_out.append(self.stack_in.pop())
            return self.stack_out.pop()  # 出栈
        
        else:   # 出栈不为空,直接弹出
            
            return self.stack_out.pop()  # 出栈
            


    def peek(self):
        """
        :rtype: int
        """
        # 从出栈中找,复用pop代码
        
        result = self.pop()
        self.stack_out.append(result)   # 再压栈
        
        return result


    def empty(self):
        """
        :rtype: bool
        """
        # 只要in或者out有元素,说明队列不为空
        
        return not (self.stack_in or self.stack_out)



# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()

LeetCode225 用队列实现栈

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

⭐一个队列模拟栈(两个队列也可以模拟栈,看文章讲解)

流程演示:

image-20240301214202300

class MyStack(object):

    def __init__(self):
        self.que = deque()

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


    def pop(self):
        """
        :rtype: int
        """
        for i in range(len(self.que) - 1):
            self.que.append(self.que.popleft())
        return self.que.popleft()


    def top(self):
        """
        :rtype: int
        """
        res = self.pop()
        self.que.append(res)
        return res


    def empty(self):
        """
        :rtype: bool
        """
        return not self.que


# Your MyStack object will be instantiated and called as such:

# obj = MyStack()

# obj.push(x)

# param_2 = obj.pop()

# param_3 = obj.top()

# param_4 = obj.empty()

deque是栈和队列的一种广义实现,deque是”double-end queue”的简称https://blog.csdn.net/chl183/article/details/106958004