Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实现一个包含2个堆栈的队列,并分析运行时间_Python_Queue - Fatal编程技术网

Python 实现一个包含2个堆栈的队列,并分析运行时间

Python 实现一个包含2个堆栈的队列,并分析运行时间,python,queue,Python,Queue,我已经复习了很多面试问题中的一些。 我想知道如何在Python中使用两个堆栈实现队列。为了理解这两种数据结构,我正在研究算法问题,以实现一个具有两个堆栈的队列。 我有以下资料: class QueueTwoStacks: def __init__(self): self.in_stack = [] self.out_stack = [] def enqueue(self, item): self.in_stack.append(item) def dequeu

我已经复习了很多面试问题中的一些。 我想知道如何在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)时间推送和弹出


我感谢你对此的解释。谢谢。是的。我们可以优化队列中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)
#

#