问题:
- 队列的插入和删除遵循先入先出的原则,而堆栈遵循后进先出的原则。
- 用两个堆栈模拟队列,要求实现时不能分配超过O(1)的内存,时间复杂度必须是o(m)。
思路:
- 用两个堆栈模拟队列,必须要支持两种操作,enqueue和dequeue,前者在队列末尾加入一个元素,后者把队列头部的元素取出。
- 步骤一:通过enqueue连续将“12345”插入队列,这5个数在堆栈A中的排列是“12345”,即1在底部,5在顶部。
- 步骤二:调用dequeue操作将1取出,即将A中元素依次弹出,压入堆栈B,于是堆栈B队列中为“54321”,也就是5在底部,1在顶部,于是直接把B的顶部元素弹出即可。
class StackQueue:def __init__(self):self.stackA = []self.stackB = []def enqueue(self,v):self.stackA.append(v)def dequeue(self):if len(self.stackB) == 0 :while len(self.stackA) > 0 :self.stackB.append(self.stackA.pop())return self.stackB.pop()sq = StackQueue()print("enqueue:")
for i in range(6):sq.enqueue(i)print("{0}".format(i), end="")print("\ndequeue:")
for i in range(6):print("{0}".format(sq.dequeue()), end="")
运行结果:
enqueue:
012345
dequeue:
012345