python两个栈实现一个队列_用2栈python实现一个队列并分析运行中的tim

该博客讨论了如何利用两个栈来优化队列操作,包括enqueue和dequeue,达到O(1)的时间复杂度。文章中提供了一个Queue类的实现,通过一个主栈和一个辅助栈来模拟队列的行为,并通过测试用例验证了其正确性和效率。
摘要由CSDN通过智能技术生成

是的。我们可以优化队列上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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值