【leetcode 66题 之 9 用两个栈实现队列】

题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

解析:

栈:先进后出

队列:先进先出

题目是用两个栈实现一个队列,可以根据栈操作两次先进后出,就可以使得Pop的顺序变成队列的Pop操作。

假设一组数:3、5、11、19、8、7、10

辅助工具:stack1、stack2

队列的push操作可直接利用list的append操作,这个别无二致。

队列的pop操作相对来说比较复杂,push操作把一组数压入stack1【3,5,11】,然后将stack1的所有数全部pop到stack2中【11,5,3】,使用stack2的pop操作即可完成队列的pop操作,即3出栈stack2。注意顺序,stack2主要用来pop,当把stack2中所有的数都pop完,再把stack1的数压入stack2。

代码如下:

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.stack1 = []
        self.stack2 = []
    def push(self, node):
        self.stack1.append(node)
        
    def pop(self):
        # return xx
        size1 = len(self.stack1)
        size2 = len(self.stack2)
        if size1 == 0 and size2 == 0:
            return None
        elif size1 !=0 and size2 == 0:
            for i in range(size1):
                self.stack2.append(self.stack1.pop())
            return self.stack2.pop()
        else:
            return self.stack2.pop()

相关题目:

利用两个队列实现一个栈,完成栈的Push和Pop操作。 栈中的元素为int类型。

方法与上述相同。

1. Push操作可以使用append来实现。

2. Pop操作可以借助两个队列:queue1和queue2

使用queue1来接收Push的值,需要Pop的时候就把queue1的所有值入队列queue2,每次都需要互相交换两个队列的地址,这里设定每次的操作都是使用queue1执行Push操作,使用queue2执行Pop操作。

代码如下:

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.Queue1 = []
        self.Queue2 = []

    def push(self, node):
        self.Queue1.append(node)

    def pop(self):
        # return xx
        size1 = len(self.Queue1)
        size2 = len(self.Queue2)
        if size1 == 0 and size2 == 0:
            return None
        if size1 != 0:
            while(len(self.Queue1) != 1):
                self.Queue2.append(self.Queue1.pop(0))
            self.Queue2, self.Queue1 = self.Queue1, self.Queue2
            return self.Queue2.pop(0)

if __name__ == '__main__':
    solution = Solution()
    solution.push(3)
    solution.push(5)
    solution.push(11)
    print(solution.pop())
    solution.push(19)
    print(solution.pop())

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值