問題:
- 隊列的插入和刪除遵循先入先出的原則,而堆棧遵循后進先出的原則。
- 用兩個堆棧模擬隊列,要求實現時不能分配超過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