最小栈
题目
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
- MinStack() 初始化堆栈对象。
- void push(int val) 将元素val推入堆栈。
- void pop() 删除堆栈顶部的元素。
- int top() 获取堆栈顶部的元素。
- int getMin() 获取堆栈中的最小元素。
示例1:
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
提示:
- -231 <= val <= 231 - 1
- pop、top 和 getMin 操作总是在 非空栈 上调用
- push, pop, top, and getMin最多被调用 3 * 104 次
定义方法
我们先把栈所需要的方法定义好,接下来我们采用数组去实现栈
class MinStack {
public MinStack() {
}
public void push(int val) {
}
public void pop() {
}
public int top() {
}
public int getMin() {
}
}
初始化
用两个数组表示两个栈,设置两个变量代表栈顶,dataStack
表示元素栈用来存放用户随意添加的值,minStack
表示辅助栈把用户在dataStack
里面的最小值添加到minStack
class MinStack {
private Integer[] dataStack; // 元素栈
private Integer[] minStack; // 最小值栈
private int top; // 栈顶
private int min;
public MinStack() {
dataStack = new Integer[10];
minStack = new Integer[10];
top = -1;
min = -1;
}
....
}
实现push方法
实现push方法,具体步骤
- 将值添加到
dataStack
,并top++表示dataStack
栈顶+1 - 判断
minStack
是否是第一次,是第一次直接把val
添加到minStack
。或者判断minStack[min] >= val
,如果成立则添加到minStack
中并++min
- 判断
dataStack
和minStack
是否栈满如果栈满则进行扩容
具体代码如下
public void push(int val) {
if (top == dataStack.length - 1) {
extendStack();
}
dataStack[++top] = val;
if (min < 0 || minStack[min] >= val) {
minStack[++min] = val;
}
}
public void extendStack() {
dataStack = Arrays.copyOf(dataStack, top * 2);
minStack = Arrays.copyOf(minStack, top * 2);
}
实现pop方法
实现pop
需要判断dataStack
栈顶minStack
是否相等,如果相等则min--
然后top--
,也可以写成方法二
方法一:
public void pop() {
int data = dataStack[top];
int minx = minStack[min];
if (data == minx) {
min--;
}
top--;
}
方法二
public void pop() {
if(dataStack[top].equals(minStack[min])) {
min--;
}
top--;
}
实现top方法
public int top() {
return dataStack[top];
}
实现getMin方法
我们只需要把minStack进行出栈就知道最小值了
public int getMin() {
if (min <= 0) {
throw new RuntimeException("栈空了");
}
return minStack[min];
}
完整代码如下
public class MinStack {
private Integer[] dataStack;
private Integer[] minStack;
private int top;
private int min;
public MinStack() {
dataStack = new Integer[10];
minStack = new Integer[10];
top = -1;
min = -1;
}
public void push(int val) {
if (top == dataStack.length - 1) {
extendStack();
}
dataStack[++top] = val;
if (min < 0 || minStack[min] >= val) {
minStack[++min] = val;
}
}
public void pop() {
if(dataStack[top].equals(minStack[min])) {
min--;
}
top--;
}
public int top() {
return dataStack[top];
}
public int getMin() {
return minStack[min];
}
public void extendStack() {
dataStack = Arrays.copyOf(dataStack, top * 2);
minStack = Arrays.copyOf(minStack, top * 2);
}
}
进行测试
定一个测试类进行测试
public class MinStackTest {
public static void main(String[] args) {
MinStack minStack = new MinStack();
minStack.push(0);
minStack.push(1);
minStack.push(0);
System.out.println("minStack = " + minStack.getMin());
minStack.pop();
System.out.println("minStack.top() = " + minStack.top());
System.out.println("minStack = " + minStack.getMin());
}
}
测试结果如下,符合题目