1、问题描述
定义栈的数据结构,并在该类型中实现一个能得到栈中最小元素的min函数。要求min,push,和pop操作的时间复杂度为 O ( 1 ) O(1) O(1)。
2、解题思路
- 思路1:可以借助一个辅助栈,每次在对数据栈做压栈操作时,同时也把数据栈中的最小元素压入辅助栈;而对数据栈做弹出操作时,同时也将辅助栈中的栈顶元素弹出。
- 以下面这个具体例子来解释思路1:
步骤 | 操作 | 数据栈 | 辅助栈 | 最小值 |
---|---|---|---|---|
1 | 压入3 | 3 | 3 | 3 |
2 | 压入4 | 3,4 | 3,3 | 3 |
3 | 压入2 | 3,4,2 | 3,3,2 | 2 |
4 | 压入1 | 3,4,2,1 | 3,3,2,1 | 1 |
5 | 弹出 | 3,4,2 | 3,3,2 | 2 |
6 | 弹出 | 3,4 | 3,3 | 3 |
7 | 压入0 | 3,4,0 | 3,3,0 | 0 |
表1:栈内连续压入3,4,2,1之后两次弹出栈顶元素再压入0时数据栈、辅助栈、以及最小值的状态
3、代码实现
# -*- coding:utf-8 -*-
class Solution:
datastack = []
minstack = []
def push(self, node):
# write code here
if len(self.minstack) == 0 :
self.minstack.append(node)
else:
if node < self.minstack[-1]:
self.minstack.append(node)
else:
self.minstack.append(self.minstack[-1])
self.datastack.append(node)
def pop(self):
# write code here
if len(self.datastack) > 0 and len(self.minstack) > 0:
self.datastack.pop()
self.minstack.pop()
def top(self):
# write code here
if len(self.datastack) > 0:
return self.datastack[-1]
else:
return
def min(self):
# write code here
if len(self.datastack) > 0 and len(self.minstack) > 0:
return self.minstack[-1]
else:
return