剑指offer-5.用两个栈实现队列-Python

5.用两个栈实现队列

题目描述

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

记录

栈:先进后出 队列:先进先出
1.先定义两个空栈,stack1负责入栈,stack2负责出栈。
2.利用push()将元素压入stack1中:[1,2,3],此时stack2是空的
3.将stack1的所有元素pop出并push到stack2中:[3,2,1],stack2pop出的元素即为res:[1,2,3]。
4.stack2中的元素如果没有pop结束[3,2],即如果stack1中插入新的元素[4],这时如果将stack1中新的元素插入到stack2中[3,2,4],输出的顺序就会出现问题[4,2,3]。于是对stack2进行判断,如果没有pop结束,就把里面所有元素再push到stack1:[2,3],回到步骤2,这时就算插入新的元素也是:[2,3,4],顺序没有乱。

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.stack1 = []
        self.stack2 = []
    def push(self, node):
        # write code here
        self.stack1.append(node)
    def pop(self):
        if not self.stack1:
            return None
        while self.stack1:
            self.stack2.append(self.stack1.pop())
        res = self.stack2.pop()
        while self.stack2:
            self.stack1.append(self.stack2.pop())
        return res

Tips

讨论里有大佬说的蛮好的,复制如下,增加理解:

1,整体思路是元素先依次进入栈1,再从栈1依次弹出到栈2,然后弹出栈2顶部的元素,整个过程就是一个队列的先进先出
2,但是在交换元素的时候需要判断两个栈的元素情况:
“进队列时”,队列中是还还有元素,若有,说明栈2中的元素不为空,此时就先将栈2的元素倒回到栈1 中,保持在“进队列状态”。
“出队列时”,将栈1的元素全部弹到栈2中,保持在“出队列状态”。
所以要做的判断是,进时,栈2是否为空,不为空,则栈2元素倒回到栈1,出时,将栈1元素全部弹到栈2中,直到栈1为空。

你可能感兴趣的:(剑指offer,队列,栈)