剑指offer ---- 包含min方法的栈----栈的压入与输出

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

用python实现栈的话很简单,因为python本身的list其实就和栈高度相似,而且还可以比栈更简单。这里要注意的是top是指找到栈顶元素的指针。不能pop要用[-1]

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.stack = []
        
    def push(self, node):
        self.stack.append(node)
        # write code here
    def pop(self):
        return self.stack.pop()
        # write code here
    def top(self):
        return self.stack[-1]
        # write code here
    def min(self):
        return min(self.stack)
        # write code here  

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

分析:
第一个关键点是不知道栈的大小,所以有高有低,也不知道栈的多少。
第二个关键点是出栈和入栈的特点,只知道压入顺序,说明:一开始是1,2,3,4,5的顺序进入的。
第三个关键点是弹出序列,由于不知道栈的高低,所以也不知道具体是哪一种。但是可以根据这个东西知道我们栈的高低是多少。

比如给出的是4,5,3,2,1

那么我们先创建一个副栈,来模拟实际栈的高低,按照压入顺序入栈,直到和弹出的顺序首位相等,那么说明了已经满了,这时候的栈。比如这里入副栈到4的话已经满了。这时候两个都弹出,因为如果还要入栈5的话,4就必须离开。这时候五进入。然后这个就是最终的出栈顺序了。这个和刚刚的已经弹出了第一个进行比较就可以知道符不符合了。因为这时候的副栈弹出顺序一定是等同于弹出顺序的,不然就是有问题的东西。

解决问题的关键是了解好入栈和出栈的特点即可。

class Solution:
    def IsPopOrder(self, pushV, popV):
        sub_stack = []
        while pushV:
            if pushV[0] != popV[0]:
                sub_stack.append(pushV.pop(0))
            else:
                pushV.pop(0)
                popV.pop(0)
        sub_stack.reverse()        
        if sub_stack == popV:
            return True
        else:
            return False
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值