gpt4 book ai didi

python - 用2个栈python实现一个队列并分析运行时间

转载 作者:太空宇宙 更新时间:2023-11-04 03:00:09 26 4
gpt4 key购买 nike

我已经复习了许多编码面试问题中的一些问题。我想知道如何在 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)

关于python - 用2个栈python实现一个队列并分析运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41154273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com