1、题目
2、思路
看题目就是按照一定的指令,进行一系列的操作。这里使用两个栈来进行维护:题解中给出一张图,大家可以看下:
- 首先初始化原始栈stack 和最小值栈stack_min(存储每次跟原栈中元素比较后的最小元素):
- 接下来插入(push) ‘1’这个元素,此时两个栈的变化如下图:
- 然后再插入(push) ‘2’这个元素,此时两个栈又变化如下图:
- 接着要获取栈顶元素,如下图:
- 而弹出栈顶元素,也直接调用pop函数 即可。
- 接着再次插入第三个元素 ‘1’,两个栈又发生如下变化👇:
- 最后再次利用top函数获取到栈顶元素就变成了 1,调用min函数则获取最小值依然是 -1。
- 最后再次利用top函数获取到栈顶元素就变成了 1,调用min函数则获取最小值依然是 -1。
· 相信大家能看懂这个这个图吧! 看不懂没事,看代码,给大家写出注解:
3、代码
import java.util.Stack;
public class Solution {
// 初始化两个栈,一个栈用来维护原始的序列,一个用来存储排序的序列
Stack<Integer> data = new Stack<Integer>();
Stack<Integer> min = new Stack<Integer>();
Integer temp = null;
// 元素添加方法
public void push(int node) {
if(temp != null){
// 存储的是已经入栈中最小的元素
if(node <= temp ){
temp = node;
min.push(node);
}
// 原始序列
data.push(node);
}else{
temp = node;
data.push(node);
min.push(node);
}
}
public void pop() {
int num = data.pop();
int num2 = min.pop();
// 如果弹出的不是最小元素,那么是需要再次添加回去的,保证最小元素的存在
if(num != num2){
min.push(num2);
}
}
// 获取栈顶元素
public int top() {
int num = data.pop();
data.push(num);
return num;
}
// 获取 最小元素
public int min() {
int num = min.pop();
min.push(num);
return num;
}
}