包含min函数的栈 python_剑指Offer(二十):包含min函数的栈

摘要

定义栈的数据结构,请在类型中实现一个能够得到栈最小元素的min函数。

一、前言

本系列文章为《剑指Offer》刷题笔记。

刷题平台:牛客网

书籍下载:共享资源

二、题目

定义栈的数据结构,请在类型中实现一个能够得到栈最小元素的min函数。

1、思路

使用两个stack,一个为数据栈,另一个为辅助栈。数据栈用于存储所有数据,辅助栈用于存储最小值。

举个例子:

入栈的时候:首先往空的数据栈里压入数字3,显然现在3是最小值,我们也把最小值压入辅助栈。接下来往数据栈里压入数字4。由于4大于之前的最小值,因此我们只要入数据栈,不压入辅助栈。

出栈的时候:当数据栈和辅助栈的栈顶元素相同的时候,辅助栈的栈顶元素出栈。否则,数据栈的栈顶元素出栈。

获得栈顶元素的时候:直接返回数据栈的栈顶元素。

栈最小元素:直接返回辅助栈的栈顶元素。

2、代码

C++:

C++

class Solution {

public:

void push(int value) {

Data.push(value);

if(Min.empty()){

Min.push(value);

}

if(Min.top() > value){

Min.push(value);

}

}

void pop() {

if(Data.top() == Min.top()){

Min.pop();

}

Data.pop();

}

int top() {

return Data.top();

}

int min() {

return Min.top();

}

private:

stack Data;//数据栈

stack Min;//最小栈

};

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27classSolution{

public:

voidpush(intvalue){

Data.push(value);

if(Min.empty()){

Min.push(value);

}

if(Min.top()>value){

Min.push(value);

}

}

voidpop(){

if(Data.top()==Min.top()){

Min.pop();

}

Data.pop();

}

inttop(){

returnData.top();

}

intmin(){

returnMin.top();

}

private:

stackData;//数据栈

stackMin;//最小栈

};

Python:

Python

class Solution:

def __init__(self):

self.Data = []

self.Min = []

def push(self, node):

# write code here

self.Data.append(node)

if self.Min:

if self.Min[-1] > node:

self.Min.append(node)

else:

self.Min.append(self.Min[-1]) #保证Min栈的栈顶一直指向最小的数字,即使出现重复输入也不会出错

else:

self.Min.append(node)

def pop(self):

# write code here

if self.Data == []:

return None

self.Min.pop()

return self.Data.pop()

def top(self):

# write code here

if self.Data == []:

return None

return self.Data[-1]

def min(self):

# write code here

if self.Min == []:

return None

return self.Min[-1]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30classSolution:

def__init__(self):

self.Data=[]

self.Min=[]

defpush(self,node):

# write code here

self.Data.append(node)

ifself.Min:

ifself.Min[-1]>node:

self.Min.append(node)

else:

self.Min.append(self.Min[-1])#保证Min栈的栈顶一直指向最小的数字,即使出现重复输入也不会出错

else:

self.Min.append(node)

defpop(self):

# write code here

ifself.Data==[]:

returnNone

self.Min.pop()

returnself.Data.pop()

deftop(self):

# write code here

ifself.Data==[]:

returnNone

returnself.Data[-1]

defmin(self):

# write code here

ifself.Min==[]:

returnNone

returnself.Min[-1]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值