09. 用两个栈实现队列
用栈(列表表示)来实现队列时,数据应该放在栈中
方法一:一个栈用来放数据,一个栈用来做中间容器
class CQueue:
def __init__(self):
self.data_stack = []
self.help_stack = []
def appendTail(self, value: int) -> None:
self.data_stack.append(value)
def deleteHead(self) -> int:
for i in range(len(self.data_stack)):
self.help_stack.append(self.data_stack.pop())
try:
head = self.help_stack.pop()
except:
return -1
for i in range(len(self.help_stack)): # 弹出队首元素后会把数据依旧放回data_stack
self.data_stack.append(self.help_stack.pop())
return head
方法二:数据可能存放在两个栈中
前一次deleteHead操作后数据可能留在B中,省去放回A的过程,下次直接从B中删除即可,提高时间效率
class CQueue:
def __init__(self):
self.A, self.B = [], []
def appendTail(self, value: int) -> None:
self.A.append(value)
def deleteHead(self) -> int:
if self.B: return self.B.pop()
if not self.A: return -1
while self.A:
self.B.append(self.A.pop())
return self.B.pop()
- 复杂度分析
- 时间复杂度:appendTail()函数为 O ( 1 ) O(1) O(1),deleteHead()函数在 N N N次队首元素操作中总共需要完成 N N N个元素的倒序
- 空间复杂度 O ( N ) O(N) O(N):最差情况下,栈A和B共保存 N N N个元素
30. 包含min函数的栈
方法:建数据栈保存数据,辅助栈顶保存最小元素,辅助栈栈底到栈顶逐渐减小(非严格降序)
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.data = []
self.minimum = []
def push(self, x: int) -> None:
self.data.append(x)
if not self.minimum or self.minimum[-1] >= x: # 用等于号是因为可能有多个最小值
self.minimum.append(x)
def pop(self) -> None:
if self.data.pop() == self.minimum[-1]:
self.minimum.pop() # 如果栈顶是最小值,则最小值栈栈顶也一并删除
def top(self) -> int:
if self.data != []:
return self.data[-1]
def min(self) -> int:
return self.minimum[-1]