两个栈实现队列

栈的特点是LIFO后进先出(last in first out)

队列

队列与栈不同,它是FIFO先进先出(first in first out)结构

用两个栈实现一个队列

这是剑指offer的第7题,用两个栈来实现一个队列,完成队列的push和pop操作。队列中的元素为int类型。

思路

对于两个栈s1和s2,始终用s1作为存储空间,以s2为临时缓冲区。

  • 入队时,将元素直接压入s1.
  • 出队时,将s1中的元素逐个弹出并压入s2,将s2的top元素弹出作为出队元素,之后再将s2中剩下的元素逐个弹出并压入s1。

对于这个思路来说,其实有一个小细节可以优化,在出队时,将s1的元素逐个弹出并压入s2时,在s1栈底的那个元素不需要倒入s2,可以直接弹出作为出队元素。这样可以减少一次压栈操作。

实现

# -*- coding:utf-8 -*-
class Solution:
    # 思路:
    # 始终用s1作为存储空间, s2作为临时缓冲区
    # 入队时,将元素压入s1
    # 出队时,将s1中的元素逐个弹出并压入s2,将s2顶部元素弹出作为出对元素,再将s2中的元素弹出并压入s1
    def __init__(self):
        self.s1 = []
        self.s2 = []
    def push(self, node):
        # write code here
        self.s1.append(node)

    def pop(self):
        # return xx
        while len(self.s1)!=0:
            self.s2.append(self.s1.pop())

        pop_item = self.s2.pop()
        while len(self.s2)!=0:
            self.s1.append(self.s2.pop())
        return pop_item
# test
sol = Solution()
sol.push(1)
print(sol.s1)
sol.push(2)
print(sol.s1)
sol.push(3)
print(sol.s1)
sol.pop()
print(sol.s1)
sol.pop()
print(sol.s1)
sol.push(4)
print(sol.s1)
sol.pop()
print(sol.s1)
sol.push(5)
print(sol.s1)
sol.pop()
print(sol.s1)
sol.pop()
print(sol.s1)

下面是测试结果

可以看到用两个栈实现了队列的先入先出的功能。

参考:https://www.jianshu.com/p/afbfc784238a

https://github.com/gatieme/CodingInterviews/tree/master/007-%E7%94%A8%E4%B8%A4%E4%B8%AA%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值