- 【简单】 用两个栈实现队列题目链接
思路:双栈可以实现列表倒序,倒序后,stack_out执行出栈则相当于删除了stack_in的栈底元素,即对应队首元素
class CQueue:
def __init__(self):
self.stack_in = []
self.stack_out = []
def appendTail(self, value: int) -> None:
self.stack_in.append(value)
def deleteHead(self) -> int:
while self.stack_out:
return self.stack_out.pop()
if not self.stack_in:
return -1
else:
self.stack_out = [self.stack_in.pop() for i in range(len(self.stack_in))]
return self.stack_out.pop()
- 【简单】包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
难点:在普通的栈中,min的复杂度是O(n)
思路: 创建辅助栈 B 用来存储栈 A 中所有非单调减的元素
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.a = []
self.b = []
def push(self, x: int) -> None:
self.a.append(x)
if not self.b:
self.b.append(x)
elif x<=self.b[-1]:
self.b.append(x)
def pop(self) -> None:
pop_0 = self.a.pop()
if self.b[-1] == pop_0:
self.b.pop()
def top(self) -> int:
return self.a[-1]
def min(self) -> int:
if self.b: return self.b[-1]