[LeetCode]Implement Queue using Stacks

题目描述:

Implement the following operations of a queue using stacks.

  • push(x) -- Push element x to the back of queue.
  • pop() -- Removes the element from in front of queue.
  • peek() -- Get the front element.
  • empty() -- Return whether the queue is empty.

Notes:

You must use only standard operations of a stack -- which means only push to top, peek/pop from top, size, and is empty operations are valid.

Depending on your language, stack may not be supported natively. You may simulate a stack by using a list or deque (double-ended queue), as long as you use only standard operations of a stack.

You may assume that all operations are valid (for example, no pop or peek operations will be called on an empty queue).

题目大意:

使用栈实现队列的下列操作:

  • push(x) -- 将元素x加至队列尾部
  • pop() -- 从队列头部移除元素
  • peek() -- 获取队头元素
  • empty() -- 返回队列是否为空

注意:

你只可以使用栈的标准操作——这意味着只有push to top(压栈), peek/pop from top(取栈顶/弹栈顶),以及empty(判断是否为空)是允许的

取决于你的语言,stack可能没有被内建支持。你可以使用list(列表)或者deque(双端队列)来模拟,确保只使用栈的标准操作即可

你可以假设所有的操作都是有效的(例如,不会对一个空的队列执行pop或者peek操作)

解题思路:

“双栈法”或者“单栈法”均可。

双栈法:

维护两个栈inStack与outStack,其中inStack接收push操作新增的元素,outStack为pop/peek操作提供服务

由于栈具有后进先出(Last In First Out)的性质,栈A中的元素依次弹出并压入空栈B之后,栈A中元素的顺序会被逆转

当执行pop或者peek操作时,如果outStack中元素为空,则将inStack中的所有元素弹出并压入outStack,然后对outStack执行相应操作

由于元素至多只会从inStack向outStack移动一次,因此peek/pop操作的平摊开销为O(1)

Python代码:

class Queue:
    # initialize your data structure here.
    def __init__(self):
        self.inStack = []
        self.outStack = []

    # @param x, an integer
    # @return nothing
    def push(self, x):
        self.inStack.append(x)

    # @return nothing
    def pop(self):
        self.peek()
        self.outStack.pop()

    # @return an integer
    def peek(self):
        if not self.outStack:
            while self.inStack:
                self.outStack.append(self.inStack.pop())
        return self.outStack[-1]

    # @return an boolean
    def empty(self):
        return len(self.inStack) + len(self.outStack) == 0

单栈法:

在执行push操作时,使用辅助栈swap,将栈中元素顺序按照push顺序的逆序存储。

此时,push操作的时间复杂度为O(n),其余操作的时间复杂度为O(1)

Python代码:

class Queue:
    # initialize your data structure here.
    def __init__(self):
        self.stack = []

    # @param x, an integer
    # @return nothing
    def push(self, x):
        swap = []
        while self.stack:
            swap.append(self.stack.pop())
        swap.append(x)
        while swap:
            self.stack.append(swap.pop())

    # @return nothing
    def pop(self):
        self.stack.pop()

    # @return an integer
    def peek(self):
        return self.stack[-1]

    # @return an boolean
    def empty(self):
        return len(self.stack) == 0

 

本文链接:http://bookshadow.com/weblog/2015/07/07/leetcode-implement-queue-using-stacks/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。

如果您喜欢这篇博文,欢迎您捐赠书影博客: ,查看支付宝二维码

Pingbacks已关闭。

评论
  1. 硅藻泥缺点 硅藻泥缺点 发布于 2015年7月7日 14:26 #

    [路过这儿]

  2. 熹儿 熹儿 发布于 2015年12月14日 12:32 #

    博主好,我是初学者,想请教一下,单栈法那里的push 为什么不能直接用self.stack.append(x)呢,感觉这样也是符合最新的item进入list的最后呢

  3. 在线疯狂 在线疯狂 发布于 2015年12月14日 20:56 #

    队列的特点是FIFO,先进先出的;而栈是FILO,先进后出的。所以不能直接用self.stack.append(x)

张贴您的评论