【问题标题】:Implement a queue with 2 stacks python and analyze the running time用2个堆栈python实现一个队列并分析运行时间
【发布时间】:2017-04-30 11:20:00
【问题描述】:

我一直在研究许多编码面试问题中的一些问题。 我想知道在 Python 中使用两个堆栈实现一个队列。我正在研究算法问题以实现具有两个堆栈的队列,以了解这两种数据结构。 我有以下内容:

  class QueueTwoStacks:

def __init__(self):
    self.in_stack  = []
    self.out_stack = []

def enqueue(self, item):
    self.in_stack.append(item)

def dequeue(self):
    if len(self.out_stack) == 0:
        # Move items from in_stack to out_stack, reversing order
        while len(self.in_stack) > 0:
            newest_in_stack_item = self.in_stack.pop()
            self.out_stack.append(newest_in_stack_item)
        # If out_stack is still empty, raise an error
        if len(self.out_stack) == 0:
            raise IndexError("Can't dequeue from empty queue!")
    return self.out_stack.pop()

这个的运行时分析是什么?

为什么我们可以为 mm 函数调用获得 O(m)O(m) 运行时是真的。

我是否假设有一个堆栈实现并且它给了 O(1)O(1) 时间推送和弹出?

感谢您对此的解释。谢谢。

【问题讨论】:

    标签: python queue


    【解决方案1】:

    是的。我们可以优化队列中 m 个函数调用的时间成本。这种优化可以是入队和出队调用的任意组合。

    假设您已经有一个堆栈实现,并且它给了 O(1)O(1) 时间推送和弹出。

    #

    #
    class Stack():
    
        def __init__(self):
            self.stk = []
    
        def pop(self):
            """raises IndexError if you pop when it's empty"""
            return self.stk.pop()
    
        def push(self, elt):
            self.stk.append(elt)
    
        def is_empty(self):
            return len(self.stk) == 0
    
        def peek(self):
            if not self.stk.is_empty():
                return self.stk[-1]
    
    
    class Queue():
    
        def __init__(self):
            self.q = Stack()  # the primary queue
            self.b = Stack()  # the reverse, opposite q (a joke: q vs b)
            self.front = None
    
        def is_empty(self):
            return self.q.is_empty()
    
        def peek(self):
            if self.q.is_empty():
                return None
            else:
                return self.front
    
        def enqueue(self, elt):
            self.front = elt
            self.q.push(elt)
    
        def dequeue(self):
            """raises IndexError if you dequeue from an empty queue"""
            while not self.q.is_empty() > 0:
                elt = self.q.pop()
                self.b.push(elt)
            val = self.b.pop()
            elt = None
            while not self.b.is_empty() > 0:
                elt = self.b.pop()
                self.q.push(elt)
            self.front = elt
            return val
    
    
    # Now let's test
    
    
    class TestQueueTwoStacks(unittest.TestCase):
    
        def setUp(self):
            self.q = Queue()
    
        def test_queuedequue(self):
            """queue up 5 integers, check they are in there, dequeue them, check for emptiness, perform other blackbox and whitebox tests"""
            self.assertTrue(self.q.is_empty())
            self.assertTrue(self.q.q.is_empty())
            self.assertTrue(self.q.b.is_empty())
    
            l = range(5)
            for i in l:
                self.q.enqueue(i)
    
            self.assertEqual(4, self.q.peek())
            self.assertEqual(l, self.q.q.stk)
    
            s = []
            l.reverse()
            for i in l:
                elt = self.q.dequeue()
                s.append(elt)
    
            self.assertTrue(self.q.is_empty())
            self.assertTrue(self.q.q.is_empty())
            self.assertTrue(self.q.b.is_empty())
    
            l.reverse()
            self.assertEqual(s, l)
            self.assertEqual([], self.q.b.stk)
            self.assertEqual([], self.q.q.stk)
    
    if __name__ == "__main__":
        # unittest.main()
        suite = unittest.TestLoader().loadTestsFromTestCase(TestQueueTwoStacks)
        unittest.TextTestRunner(verbosity=2).run(suite)
    

    【讨论】:

      猜你喜欢
      • 2014-12-23
      • 1970-01-01
      • 2014-04-21
      • 2010-10-15
      • 2010-09-09
      • 2021-12-24
      • 2021-02-05
      • 2017-12-21
      • 2011-11-15
      相关资源
      最近更新 更多