1、题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 min 函数操作时,栈中一定有元素。
此栈包含的方法有:
push(value):将value压入栈中
pop():弹出栈顶元素
top():获取栈顶元素
min():获取栈中最小元素
2、算法分析
题目让求的是栈中最小的元素。
定义两个栈
1、StackData存储的是栈中的元素
2、StackMin存储的是栈中最小的元素题目中给了四个方法:
push:将元素添加到stackData中,stackMin的栈顶存储的是栈中最小的元素,所以每次添加元素的时候都需要和stackMin栈顶元素比较。当stackMin为空的话,添加元素。不空的话,比较一个node和stackMin.peek()栈顶元素的大小。node小的话,添加进去,node比较大的话,stackMin添加stackMin.peek栈顶元素。
pop:出栈元素
top:获取的是stackData的栈顶元素
min:获取栈stackData中的最小元素
3、代码实现
import java.util.Stack;
public class Solution {
// StackData存储的是栈中的元素
// StackMin存储的是栈中最小的元素
Stack<Integer> stackData = new Stack<>();
Stack<Integer> stackMin = new Stack<>();
public void push(int node) {
if(stackMin.isEmpty()){
stackMin.push(node);
}else{
// stackMin最小元素大于node的话,说明node是最小的
if(stackMin.peek() > node){
stackMin.push(node);
}else{
// 在stackMin栈顶添加stackMin.peek()相同的元素
stackMin.push(stackMin.peek());
}
}
stackData.push(node);
}
public void pop() {
if(!stackData.isEmpty()){
stackData.pop();
}
if(!stackMin.isEmpty()){
stackMin.pop();
}
}
public int top() {
if(!stackData.isEmpty()){
return stackData.peek();
}
return -1;
}
public int min() {
if(!stackMin.isEmpty()){
return stackMin.peek();
}
return -1;
}
}