美文网首页程序员
两个队列实现栈,两个栈实现队列

两个队列实现栈,两个栈实现队列

作者: 不_一 | 来源:发表于2018-03-14 13:10 被阅读0次

1、两个栈实现一个队列

有三种思路:

思路一:将stack1作为存储空间,将stack2作为临时缓冲区,入队时,直接压入stac1,出队时,将stack1中的元素依次出栈压入stack2中,再将stack2的栈顶元素弹出,最后将stack2中的元素再倒回给stack1

思路二:入队时,判断stack1是否为空,如果stack1为空,则将stack2中的所有元素都倒入stack1中,再将元素直接压入stack1,否则,直接压入stack1中
出队时,判断stack2是否为空,如果stack2为空,则将stack1中的元素倒入stack2中,在将stack2的栈顶元素弹出,否则,直接弹出stack2的栈顶元素
思路三:入队时,直接压入stack1中出队时,判断stack2是否为空,如果stack2为空,则将stack1中的元素倒入stack2中,否则直接弹出stack2中的元素
思路一与思路二相比,如果是连续出栈操作或连续进栈操作,思路二比思路一好很多。思路三最好代码如下。

栈实现Q
# 两个栈实现一个队列
# 栈先近后
# 列表的append 和pop结合就是栈
class QueueWithTwoStack(object):

    def __init__(self):
        self._stack1 = []
        self._stack2 = []

    def pop(self):
        if self._stack2:
            return self._stack2.pop()
        elif not self._stack1:
            return None
        else:
            while self._stack1:
                self._stack2.append(self._stack1.pop())
        return self._stack2.pop()

    def push(self, x):
        self._stack1.append(x)


a = QueueWithTwoStack()

for i in range(5):
    a.push(i)
for i in range(5):
    print(a.pop())

2、两个队列实现一个栈

将queue1用作进栈出栈,queue2作为一个中转站

入栈时,直接压入queue1中

出栈时,先将queue1中的元素除最后一个元素外依次出队列,并压入队列queue2中,将留在queue1中的最后一个元素出队列即为出栈元素,最后还要把queue2中的元素再次压入queue1中
图示:


Q实现栈

实现代码如下:

# 两个队列实现一个栈
# 队列就是先进先出 使用列表的append() 和pop(0)实现
# 栈就是先进后出

class StackWithTwoQueue(object):
    def __init__(self):
        self._queue1 = []  #
        self._queue2 = []

    def push(self, x):
        self._queue1.append(x)

    def pop(self):
        if not self._queue1:
            return None
        while self._queue1:
            if self._queue1.__len__() == 1:
                m = self._queue1.pop()
                break
            else:
                self._queue2.append(self._queue1.pop(0))
        while self._queue2:
            self._queue1.append(self._queue2.pop(0))
        return m


b = StackWithTwoQueue()
n = 3

for i in range(n):
    b.push(i)
for i in range(n):
    print(b.pop())

相关文章

  • 栈和队列

    两个栈实现队列 两个队列实现栈

  • 栈&队列

    一、栈&队列总结 栈/队列的应用接雨水验证栈序列滑动窗口的最大值 栈/队列的特殊实现用两个栈实现队列用两个队列实现...

  • 队列、栈

    两个队列实现一个栈 两个栈实现一个队列

  • 面试题9: 用两个栈实现队列

    9-1 用两个栈实现队列 9-2 用两个队列实现栈

  • 手撕栈队列

    【面试题07:用两个栈实现队列】 题目:利用两个栈实现队列的插入,取队首,判断非空等函数。拓展:用两个队列实现栈,...

  • 用两个栈实现队列,用两个队列实现堆栈

    参考:剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈 用两个栈实现队列stack1作为入...

  • 栈和队列的相互实现

    两个栈实现队列: 一个栈用来入,一个栈用来出 两个队列实现栈: 入栈的时候正常存入一个队列,出栈的时候用另一个队列...

  • Swift-两个栈实现队列

    题目:两个栈实现队列,栈是先入后出,队列是先入先出,两个栈可以利用这个特点实现队列. 核心代码: `class ...

  • LeetCode 每日一题 [43] 用两个栈实现队列

    LeetCode 用两个栈实现队列 [简单] 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appen...

  • 剑指Offer

    09 用两个栈实现队列 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 del...

网友评论

    本文标题:两个队列实现栈,两个栈实现队列

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