美文网首页
05_两个栈实现一个队列【python】

05_两个栈实现一个队列【python】

作者: NWPU_HaiboWu | 来源:发表于2019-08-12 15:55 被阅读0次

    1.题目描述

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

    2.思路分析

    【题目一】
    题目一很直白,栈的先入后出,来两次,不就成队列了。
    入栈:直接进A栈
    出栈:首先判断B栈是否有元素,有就直接输出
    若没有,就将A栈的元素全部出栈再进B栈,再输出

    【题目二】
    题目二,两个队列如果按常规操作是肯定没法产生栈的效果的
    入队:将新元素存入不为空的队列
    出队:找到不为空的队列,出队进第二个队列,直至只有一个元素,输出该元素

    特殊:需要考虑两个都为空的情况,直接输出None

    3.代码

    【题目一】两个栈实现队列

    class Solution:
        def __init__(self):
            self.stack1=[]
            self.stack2=[]
    
        def push(self,node):
            #入栈,直接往A栈存
            self.stack1.append(node)
    
        def pop(self):
            #出栈,如果B有元素,直接输出
            #如果,如果A只有元素,A出栈进B栈,再输出
            if len(self.stack1)==0 and len(self.stack2)==0:
                return None
            if len(self.stack2)>0:
                return self.stack2.pop()
            elif len(self.stack1)>1:
                while len(self.stack1):
                    self.stack2.append(self.stack1.pop())
                return  self.stack2.pop()
    

    【题目二】两个队列实现一个栈

    class Solution:
        def __init__(self):
            self.queue1=[]
            self.queue2=[]
    
        def push(self,node):
            #选择一个不为空的队列入队
            if len(self.queue1)>0:
                self.queue1.append(node)
            elif len(self.queue2)>0:
                self.queue2.append(node)
            else:
                self.queue1.append(node)
    
        def pop(self):
            """将有元素的队列出队,直至只有一个元素"""
            #如果都是空
            if len(self.queue1)<1 and len(self.queue2)<1:
                return None
            if len(self.queue1)>0:
                while len(self.queue1)>1:
                    self.queue2.append(self.queue1.pop(0))
                return self.queue1.pop(0)
            else:
                while len(self.queue2)>1:
                    self.queue1.append(self.queue2.pop(0))
                return self.queue2.pop(0)
    
    
    if __name__=="__main__":
        ss=Solution()
    
        ss.push(1)
        ss.push(2)
        print(ss.pop())
        ss.push(3)
        ss.push(4)
        ss.push(5)
    

    4.知识点

    理解list中的内置函数pop()的真正意义:

    • pop(0),输出list中的首元素,其意义就是队列的效果
    • pop()/pop(-1),输出list中的末尾元素,其意义就是栈的效果

    相关文章

      网友评论

          本文标题:05_两个栈实现一个队列【python】

          本文链接:https://www.haomeiwen.com/subject/teuujctx.html