题目
解题思路
采用辅助栈的方法
- 创建一个栈,储存数据,并创建一个辅助栈用来储存最小值
- 储存数据时如果小于辅助栈栈顶数据时候,同时储存进辅助栈
- 删除栈元素时候考虑是否为辅助栈栈顶元素
- 返回最小值时候,就返回辅助栈栈顶元素
//C#语言实现
public class MinStack {
//创建数据栈
Stack<int> stack = new Stack<int>();
//创建辅助栈
Stack<int> min_stack = new Stack<int>();
/** initialize your data structure here. */
public MinStack() {
}
public void Push(int x) {
//当辅助栈元素为0
if (min_stack.Count == 0)
min_stack.Push(x);
else
{
//判断辅助栈栈顶元素与新加入元素的大小,如果小于辅助栈栈顶元素,加入辅助栈
if (min_stack.Peek() >= x)
min_stack.Push(x);
}
stack.Push(x);
}
public void Pop() {
//判断数据栈是否为空
if(stack.Count==0)
return;
//抛出数据栈栈顶元素,并将值赋给value
var value = stack.Pop();
//判断辅助栈栈顶元素与value是否相等
if (value == min_stack.Peek())
{
min_stack.Pop();
}
}
public int Top() {
return stack.Peek();
}
public int GetMin() {
return min_stack.Peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.Push(x);
* obj.Pop();
* int param_3 = obj.Top();
* int param_4 = obj.GetMin();
*/
python实现
#python实现
class MinStack(object):
def __init__(self):
"""
initialize your data structure here.
"""
self.stack=[]
self.min_stack=[]
def push(self, x):
"""
:type x: int
:rtype: None
"""
self.stack.append(x)
if not self.min_stack or self.min_stack[-1]>=x:
self.min_stack.append(x)
def pop(self):
"""
:rtype: None
"""
if self.stack[-1]==self.min_stack[-1]:
self.min_stack.pop()
self.stack.pop()
def top(self):
"""
:rtype: int
"""
return self.stack[-1]
# 因为添加元素使用append的方法,最后进入list的在最右边,所以使用[-1]来访问
def getMin(self):
"""
:rtype: int
"""
return self.min_stack[-1]