9:用两个栈实现队列(剑指offer第2版Python)

一、用两个栈实现队列

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

# -*- 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
        # 出栈为空时,则从入栈中导入到出栈中!
        if len(self.stack2) == 0:
            if len(self.stack1) == 0:
                return
            while len(self.stack1) > 0:
                self.stack2.append(self.stack1[-1])  # 一次性全部入队
                self.stack1.pop()
        # 出栈不为空,出队
        xx = self.stack2[-1]
        self.stack2.pop()
        return xx

s = Solution()
s.push(10)
s.push(11)
s.push(12)
print(s.pop())
s.push(13)
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())  # 排查异常

二、(变形)用两个队列实现栈

# -*- coding:UTF-8 -*-
'''
两个队列实现栈: 先进先出,实现栈的“后进先出”
'''
class Solution:
    def __init__(self):
        # 两个队列交替辅助
        self.queue1 = []
        self.queue2 = []
    # 入栈
    def push(self, x):
        if self.queue2 == []:
            self.queue1.append(x)
        else:
            self.queue2.append(x)
    # 出栈
    def pop(self):
        if self.queue1 == [] and self.queue2 == []:
            return
        # 现将队列前(length-1)个依次出队进入辅助空队列,在pop掉最后进来的元素
        if self.queue1 != []:
            length = len(self.queue1)
            for i in range(length-1):
                # queue2辅助,存储queue1先出来的元素length-1个
                self.queue2.append(self.queue1.pop(0))
            return self.queue1.pop(0)  # 弹出queue1最后一个元素,至此queue1为空
        if self.queue2 != []:
            length = len(self.queue2)
            for i in range(length-1):
                self.queue1.append(self.queue2.pop(0))
            return self.queue2.pop(0)

s = Solution()
s.push(10)
s.push(11)
s.push(12)
print(s.pop())
s.push(13)
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())



发布了184 篇原创文章 · 获赞 225 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/IOT_victor/article/details/104527495