剑指Offer(Python语言)面试题30,31

面试题30:包含min函数的栈

题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push以及pop的时间复杂度都是o(1)。

python代码:

# coding=utf8
'''
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用
min、push及pop的时间复杂度都是O(1)。
'''
 
class Stack():
    def __init__(self):
        self.main_stack = []
        # 辅助栈,每次次最小的元素压入辅助栈
        self.assist_stack = []
        # 记录栈中的最小元素
        self._min = None
    
    def min(self):
        return self._min
    
    def push(self, data):
        self.main_stack.append(data)
        if self._min is None:
            self._min = data
        else:
            if data < self._min:
                self._min = data
        # 将最小的元素压入辅助栈
        self.assist_stack.append(self._min)
    
    def pop(self):
        if len(self.main_stack) == 0:
            raise Exception('no data')
        elif len(self.main_stack) == 1:
            self.assist_stack.pop()
            self._min = None
            return self.main_stack.pop()
        else:
            self.assist_stack.pop()
            self._min = self.assist_stack[-1]
            return self.main_stack.pop()
    
if __name__ == '__main__':
    s = Stack()
    s.push(3)
    s.push(4)
    s.push(2)
    s.push(1)
    print s.min()
    s.pop()
    s.pop()
    print s.min()
    s.pop()
    print s.min()
    s.pop()
    print s.min()
    s.pop()

面试题31:栈的压入,弹出序列

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

思路:

pythond代码:

# -*- coding:utf-8 -*-
class Solution:
    def IsPopOrder(self, pushV, popV):
        # write code here
        if len(popV) == 0 or len(pushV) != len(popV):
            return False
        stackData = []
        for i in pushV:
            stackData.append(i)
            while len(stackData) and stackData[-1] == popV[0]:
                stackData.pop()
                popV.pop(0)
        if len(stackData):
            return False
        return True

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凤凰AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值