最小栈
题目
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) – 将元素 x 推入栈中。
pop() – 删除栈顶的元素。
top() – 获取栈顶元素。
getMin() – 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
链接:https://leetcode-cn.com/problems/min-stack
思路
使用一个栈存储最小值,每次要入栈值时,如果最小栈不存在值,则同时将此值直接存入最小栈,否则比较入栈的值是否小于等于最小栈的栈顶的值,如果成立,则同时在最小栈Push该值,每次出栈时,比较该值时候等于最小栈的栈顶的值,如果相等,则同时在最小栈顶端移除该值。
获取最小值时直接弹出最小栈的栈顶即可。
源代码(C#)
public class MinStack
{
Stack<int> stack = new Stack<int>();
Stack<int> minStack = new Stack<int>();
/** initialize your data structure here. */
public MinStack()
{
}
public void Push(int x)
{
if (minStack.Count == 0)
{
minStack.Push(x);
}
else
{
if (minStack.Peek() >= x)
{
minStack.Push(x);
}
}
stack.Push(x);
}
public void Pop()
{
if (stack.Count == 0) return;
var value = stack.Pop();
if (value == minStack.Peek())
{
minStack.Pop();
}
}
public int Top()
{
return stack.Peek();
}
public int GetMin()
{
return minStack.Peek();
}
}