232. 用栈实现队列

232. 用栈实现队列

思路:
在这里插入图片描述

注意事项:

题目要求用2个栈实现一个队列,而不是一个列表实现队列,python中用list代替栈,只不过这个list根据题目要求只能用标准的栈操作,即append元素到栈顶,从栈顶pop出元素
在这里插入图片描述

思路: 队列是先进先出,栈是先进后出, 要求用两个栈

第一步. 先把 1 2 3按顺序放进第一个栈,stack = [1, 2, 3]

第二步. 然后把第一个栈的所有值放到第二个栈,根据先进后出,从第一个栈拿的顺序是3 2 1,所以放进第二个栈的顺序是3 2 1,stack2 = [3, 2, 1]

第三步. 从第二个栈拿数据,根据先进后出,取的顺序是1 2 3,

从而实现按照 1 2 3顺序放入MyQueue, 以 1 2 3的顺序从MyQueue取出
————————————————————————————————————————

class MyQueue:

    def __init__(self):
        self.stack1 = []
        self.stack2 = []

    def push(self, x: int) -> None:
        """将元素 x 推到队列的末尾"""
        # 第一步 stack1 = [1, 2, 3]
        self.stack1.append(x)

    def pop(self) -> int:
        """从队列的开头移除并返回元素"""
        # 如果stack2有,那就先返回stack2的,
        # 这里是防止,多次pop没pop完,这个时候push了一个值,如果直接走到下边while,会将这个值放到stack2,会先把这个值pop出去
        if self.stack2:
            return self.stack2.pop()

        # 第二步 把第一个栈的所有值放到第二个栈,从第一个栈拿的顺序是3 2 1,所以放进第二个栈的顺序是3 2 1,
        # stack2 = [3, 2, 1]
        while len(self.stack1) > 0:
            item = self.stack1.pop()
            self.stack2.append(item)
        # 第三步 从第二个栈取的顺序是1 2 3 
        # 由于pop只返回一个,那就只pop一次,pop取出的是[3, 2, 1]中的最后一个值1 实现了队列的先进先出
        return self.stack2.pop()

    def peek(self) -> int:
        """返回队列开头的元素,不pop"""
        # if self.stack2:
        #     # 这里是-1 原因是拿队列开头的元素,就是stack2=[3, 2, 1]中最后一个元素
        #     return self.stack2[-1]
        # elif self.stack1:
        #     # 这里是0 原因是 走到这里肯定stack2是空的,那应该stack1刚push进来一些值,stack1=[4,5,6],push顺序是456所以要拿[0]号索引
        #     return self.stack1[0]
        # else:
        #     return None

        # 上面的方法也行 但是比较麻烦,可以先pop然后再给stack2补一个
        # 为什么给stack2补:根据实现的pop方法,给stack2加一个 下次queue.pop的时候优先会推出刚插进来的这个值
        item = self.pop()
        self.stack2.append(item)
        return item
        

    def empty(self) -> bool:
        # 两个栈都是空,队列就是空
        return not self.stack1 and not self.stack2


# 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()
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值