关于栈的算法题

1.题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如:序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

class Solution():
    def compare(self,pushv,popv):
        stack =[]
        index = 0
        if pushv == [] or len(pushv)!= len(popv):
            return None
        for i in pushv:
            stack.append(i)
            #注意:当stack列表为空时,stack[-1]会出问题
            while stack and stack[-1] == popv[index]:
                stack.pop()
                index += 1
        #当popv是pushv的弹出队列时,stack列表中元素被全部弹出
        if len(stack)== 0:
            return True
        else:
            return False

if __name__== "__main__":
    x = Solution()
    pushv = [1,2,3,4,5]
    popv = [4,3,5,2,1]
    a = x.compare(pushv,popv)
    print(a)

2.定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))

思路:由于时间复杂度为O(1),则用空间换时间。

class Solution():
    
    def __init__(self):
        self.stack = []
        #建立一个新的列表,用于储存当前最小元素
        self.minval = []
    
    def push(self,item):
        self.stack.append(item)
        if self.minval:
            #如果新列表中末尾值大于入栈的值,则用入栈的值替换
            if self.minval[-1] > item:
                self.minval.append(item)
            #否则继续在相应位置保留当前最小值
            else:
                self.minval.append(self.minval[-1])
        else:
            self.minval.append(item)
            
    def pop(self):
        #考虑栈为空
        if self.stack == None:
            return None
        self.stack.pop()
        self.minval.pop()
        
    def top(self):
        #考虑栈为空
        if self.stack == None:
            return None
        return self.stack[-1]
    
    def min(self):
        #考虑栈为空
        if self.minval == None:
            return None
        return self.minval[-1]
    
if __name__ == "__main__":
    s = Solution()
    s.push(5)
    s.push(2)
    s.push(4)
    s.push(7)
    s.push(3)
    min = s.min()
    print(min)

输出结果:

 

注:非常感谢B站中各位大神分享的剑指offer的视频教程,我仅用该博客作为复习笔记以及知识普及。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值