leetcode 232.用栈实现队列

题目

232.用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false

解题思路

1、定义两个列表,列表1用于入栈,列表2用于出栈
2、push元素:直接使用list.append(s)向入栈列表中添加元素
3、empty:判断队列是否为空,如果入栈和出栈两个列表均为空,说明队列为空,返回True
4、pop元素:队列是先进先出
(1)如果队列为空,则pop弹出元素返回None
(2)如果队列不为空,判断出栈的列表是否为空
出栈列表不为空,直接使用pop函数从栈顶弹出元素
出栈列表为空,把入栈列表中的元素弹出到出栈列表中,再从出栈列表栈顶弹出元素
5、peek元素:
执行队列的pop操作,会把队列开头元素从出栈列表的栈顶弹出
再把弹出的元素放到出栈列表中,即可返回队列开头元素

实现代码

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

    def push(self, x: int) -> None:
        self.stack_in.append(x)
    
    def pop(self) -> int:
        if self.empty():    # 如果队列为空,pop操作没有元素可以弹出,返回None
            return None
        
        if self.stack_out:  # 如果出栈中有元素,直接从栈的末尾弹出元素
            return self.stack_out.pop() # list.pop(index = -1) pop函数移除列表的一个元素(默认是最后一个元素),并返回该元素的值
        else:   # 如果出栈中没有元素,先把入栈中的元素全部弹出,插入到出栈,再从出栈的末尾弹出元素
            for i in range(len(self.stack_in)):
                self.stack_out.append(self.stack_in.pop())
            return self.stack_out.pop()

    def peek(self) -> int:
        res = self.pop()    # 从队列的开头移除并返回元素:入栈的元素全部弹出,插入到出栈中,再从出栈末尾依次弹出元素
        self.stack_out.append(res)  # 把从出栈栈顶弹出的元素再添加到出栈中
        return res  # 返回队列开头的元素

    def empty(self, x: int) -> bool:
        # 如果出栈和入栈都没有元素,则队列为空
        return not (self.stack_out or self.stack_in)    

leetcode 225.用队列实现栈

题目

225.用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

解题思路

1、使用双向队列deque
2、在双向队列的右边添加元素,模拟将元素压入栈顶
3、移除并返回栈顶元素:
假设入栈的元素是1,2,3 则移除并返回的栈顶元素是3
如果是队列的话,进队列顺序1,2,3 出队列顺序也是1,2,3,现在用队列模拟栈移除并返回栈顶元素,则需要移除返回队列的最后一个元素3
队列模拟栈的pop方式:
1)依次从队列的左边弹出len(deque)-1个元素,剩余最后一个进队列的元素(即栈要移除并返回的栈顶元素)
2)把从队列左边弹出的元素依次添加到队列的右边
3)从队列的左边弹出并返回进队列的最后一个元素

实现代码

from collections import deque
class MyStack:

    def __init__(self):
        self.deq = deque()    # 初始化一个双向队列

    def push(self, x: int) -> None:
        self.deq.append(x)  # 在队列的右边添加一个元素,模拟在栈顶添加一个元素

    def pop(self) -> int:
        # 如果队列为空
        if self.empty():
            return None
        else:   # 队列不为空时,遍历队列左边的n-1个元素
            for i in range(len(self.deq)-1):
                self.deq.append(self.deq.popleft()) # 把左边的n-1个元素弹出后添加到队列的右边
            return self.deq.popleft()   # 返回队列中剩余的最后一个元素(队列最右边一个元素),模拟弹出栈顶元素并返回

    def top(self) -> int:
        if self.empty():
            return None
        res = self.pop()    # 弹出斌返回栈顶元素
        self.deq.append(res)    # 把弹出的栈顶元素添加到队列右边
        return res  

    def empty(self) -> bool:
        return not self.deq
posted on 2024-05-03 14:47  小鹿BAMBI  阅读(4)  评论(0编辑  收藏  举报