lintcode练习-40. 用栈实现队列

描述

正如标题所述,你需要使用两个栈来实现队列的一些操作。

队列应支持push(element),pop() 和 top(),其中pop是弹出队列中的第一个(最前面的)元素。

pop和top方法都应该返回第一个元素的值。

您在真实的面试中是否遇到过这个题?  

样例

比如push(1), pop(), push(2), push(3), top(), pop(),你应该返回1,2和2

挑战

仅使用两个栈来实现它,不使用任何其他数据结构,push,pop 和 top的复杂度都应该是均摊O(1)的


实现代码:

思路:
定义两个栈, 一个用来存放数据,一个用来进行翻转操作,实现队列。假如将1,2,3,4,5用队列表示,依次压入栈中,就成了[1, 2, 3, 4, 5], 将他们依次取出,放入另一个栈中,变成[5, 4, 3, 2, 1], 就达到了队列的效果。执行过程中要注意对栈的判空。

具体代码:
class MyQueue:
   
    def __init__(self):
        # do intialization if necessary
        self.stackPush = []  # 压入数据栈
        self.stackPop = []  # 临时存放数据栈
    """
    @param: element: An integer
    @return: nothing
    """
    def push(self, element):
        # write your code here
        #如果stackPush为空且stackPop不为空,则执行过pop或top操作,
        #这时将剩下元素重新压入stackPush中,再加入新的元素,不影响效果
        if self.stackPop and not len(self.stackPush):
            while self.stackPop:
                self.stackPush.append(self.stackPop.pop())
        self.stackPush.append(element)
    """
    @return: An integer
    """
    def pop(self):
        # write your code here
        #如果stackPush为空且stackPop也为空,没有数据,报错
        if not len(self.stackPush) and not len(self.stackPop):
            raise ValueError('your stack is empty!')
        if not len(self.stackPop):
            #如果stackpop为空,就遍历stackPUSH,全部压入stackpop中
            while self.stackPush:
                self.stackPop.append(self.stackPush.pop())
        return self.stackPop.pop()
           
    """
    @return: An integer
    """
    def top(self):
        # write your code here
        if not len(self.stackPush) and not len(self.stackPop):
            raise ValueError('your stack is empty!')
       
        if not len(self.stackPop):
            while self.stackPush:
                self.stackPop.append(self.stackPush.pop())
       
        return self.stackPop[-1]
       
       

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/81024018
今日推荐