#实时筛选出栈中的最小元素 #因为栈中的元素只能再栈顶进行操作,所以不能遍历,只能在建立栈的时候就进行比较,得出最小元素 #建立一个辅助栈min,用来存储每次比较的最小元素 #由于栈主要操作是插入或者删除,并且这两个操作都有可能改变最小元素 #插入push(e)操作:进栈第一个元素时,主栈和辅栈都进栈第一个元素;之后再进栈,先判断是否要进辅栈(只有新进的这个元素小于原来辅栈存贮的栈顶元素时才进栈),然后再进主栈 #删除pop()操作:由于进栈的性质,辅栈元素从栈底到栈顶是递增的,所以删除操作只要主栈出栈元素与辅栈栈顶元素不相等就不操作辅栈,如果相等就一起出栈
具体代码如下:
#实时筛选出栈中的最小元素
#因为栈中的元素只能再栈顶进行操作,所以不能遍历,只能在建立栈的时候就进行比较,得出最小元素
#建立一个辅助栈min,用来存储每次比较的最小元素
#由于栈主要操作是插入或者删除,并且这两个操作都有可能改变最小元素
#插入push(e)操作:进栈第一个元素时,主栈和辅栈都进栈第一个元素;之后再进栈,先判断是否要进辅栈(只有新进的这个元素小于原来辅栈存贮的栈顶元素时才进栈),然后再进主栈
#删除pop()操作:由于进栈的性质,辅栈元素从栈底到栈顶是递增的,所以删除操作只要主栈出栈元素与辅栈栈顶元素不相等就不操作辅栈,如果相等就一起出栈
class STACK:
def __init__(self):
self.data=[]
self.mindata=[]
#辅栈min栈的基本运算方法
#辅栈的基本操作和建立普通顺序栈是一样的
def __minempty(self): # 判断栈是否为空
if len(self.data) == 0: # 即判断列表的长度,长度为0顺序栈为空,不为0顺序栈不为空
return True
return False
def __minpush(self, e): # 元素e进栈
self.data.append(e) # 列表中的操作就是append操作
def __minpop(self): # 元素出栈
assert not self.empty()
return self.data.pop() # 列表的pop操作,返回最后一个元素
def __mingettop(self):
assert not self.empty()
return self.data[-1] # 返回列表序号为-1的元素,也就是返回最后一个元素
#主栈的运算方法(与平常的建站不同,min辅栈的建立和平常建立顺序栈是一样的,而主栈的建立需要融入min辅栈的基本操作)
def empty(self):
return len(self.data)==0#这里是一个判断语句,返回True或者False
def push(self,x):
if self.empty() or x<=self.Getmin():#进栈第一个元素时,主栈和辅栈都进栈第一个元素;之后再进栈,先判断是否要进辅栈(只有新进的这个元素小于原来辅栈存贮的栈顶元素时才进栈),然后再进主栈
self.__mindata.append(x)
self.data.append(x)
def pop(self):
assert not self.empty()
x=self.data.pop()#先主栈出栈
if x==self.__mingettop():#由于进栈的性质,辅栈元素从栈底到栈顶是递增的,所以删除操作只要主栈出栈元素与辅栈栈顶元素不相等就不操作辅栈,如果相等就一起出栈
self.__minpop()
return x
def gettop(self):
assert not self.empty()
return self.data[-1]
def Getmin(self):
assert not self.empty()
return self.__mindata[-1]
st=STACK()
print('\n元素5,6,3,7依次进栈')
st.push(5)
st.push(6)
st.push(3)
st.push(7)
print('求最小元素并出栈')
while not st.empty():
print('最小元素:%d'%(st.Getmin()))
print('出栈元素:%d' % (st.pop()))
print()
图解过程如下: