求栈中元素的最小值可以有两种方式
1.通过遍历栈中所有元素,来找出最小值。这是最容易想到的方法,但是何种方法的时间复杂度为O(n)
2.采用空间来换取时间的方式来降低时间复杂度。
使用两个栈:栈A用来存储数据,栈B用来存储栈的最小元素。如下思路:
入栈:
当入栈元素小于原来的最小值时,将这个元素赋给最小值,并将最小值入栈B。值得注意的是,当元素大于原来的最小值时,最小值不变,也要再次将最小值压入栈栈B
例如:将4,2,7,5,1依次压入栈中
栈A中从栈底到栈顶元素分别为:4,2,7,5,1
栈B中从栈底到栈顶元素分别为:4,2,2,2,1
出栈:
当出栈元素恰好为最小值时,保存最小值的栈B的栈顶元素也要出栈
代码实现:
class min_Stack(object):
def __init__(self):
self.stackA = []
self.stackB = []
self._min = None
def __str__(self,item):
return str(item)
def get_min(self):
return self._min
def push(self,item):
self.stackA.append(item)
if self._min == None:
self._min = item
else:
#比较入栈元素与最小值
if item < self._min :
self._min = item
#当前最小值入栈B
self.stackB.append(self._min)
def pop(self):
top_element = self.stackA.pop()
#判断栈顶元素是否为最小值
if top_element == self._min:
self.stackB.pop()
self._min = self.stackB[-1]
return top_element
测试:
if __name__ == '__main__':
s = min_Stack()
s.push(4)
s.push(2)
s.push(7)
s.push(5)
s.push(1)
print(s.stackB)
print(s.get_min())
print(s.pop())
print(s.get_min())
print(s.pop())
print(s.get_min())
print(s.pop())
print(s.get_min())
结果: