最小栈的实现
实现一个栈,该栈有出栈(pop)、入栈(push)、取最小元素(get_min) 。要保证时间复杂度都是O (1)。
第1步:设原有的栈叫作栈A,额外的“备胎”栈B,用于辅助栈A。
当第1个元素进入栈A时,让新元素也进入栈 B。这个唯一的元素是栈A的当前最小值。
第2步:每当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素进入栈B,此时栈B的栈顶元素就是栈A当前最小值。
第3步:每当栈A有元素出栈时,如果出栈元素是栈A当前最小值,则让栈B的栈顶元素也出栈。此时栈B余下的栈顶元素所指向的是栈A中原本第2小的元素,代替刚才的出栈元素成为栈A的当前最小值。(备胎转正。)
第4步:当调用get_min方法时,返回栈B的栈顶所存储的值,这也是栈A的最小值。
class StackMin:
def __init__(self):
'''
初始化 栈A,栈B
'''
self.stack_a=[]
self.stack_b=[]
def push(self,newele):
'''入栈'''
#入栈A
self.stack_a.append(newele)
# 若栈B为空,或新元素的值小于或等于栈B栈顶元素的值,
if len(self.stack_b)==0 or newele<=self.stack_b[len(self.stack_b)-1]:
# #将新元素压入栈B
self.stack_b.append(newele)
def pop(self):
'''出栈'''
# 如果栈A出栈元素和栈B栈顶元素的值相等,栈B的栈顶元素出栈
if self.stack_a[len(self.stack_a)-1]==self.stack_b[len(self.stack_b)-1]:
self.stack_b.pop() #出栈
return self.stack_a.pop() #出栈
def get_min(self):
#判断栈A为空
if(self.stack_a==0):
return None
#返回栈B的最小值
return self.stack_b[len(self.stack_b)-1]
if __name__ == '__main__':
#对象
stack=StackMin()
#入栈5,8,6,3,2,9
stack.push(5)
stack.push(8)
stack.push(6)
stack.push(3)
stack.push(2)
stack.push(9)
print(stack.get_min())
#出栈
stack.pop() #2
# stack.pop() #3
# stack.pop() #5
print(stack.get_min())
显然进栈、出栈、取最小值的时间复杂度都是O(1),最坏情况空间复杂度是O(n)。