面试中算法(最小栈)

最小栈的实现

      实现一个栈,该栈有出栈(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)。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值