题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 min 函数操作时,栈中一定有元素。
此栈包含的方法有:
push(value):将value压入栈中
pop():弹出栈顶元素
top():获取栈顶元素
min():获取栈中最小元素
数据范围:操作数量满足0≤n≤300 ,输入的元素满足|val|≤10000
进阶:栈的各个操作的时间复杂度是O(1),空间复杂度是O(n)
示例:
输入:["PSH-1","PSH2","MIN","TOP","POP","PSH1","TOP","MIN"]
输出:-1,2,1,-1
解析:"PSH-1"表示将-1压入栈中,栈中元素为-1
"PSH2"表示将2压入栈中,栈中元素为2,-1
"MIN"表示获取此时栈中最小元素==>返回-1
"TOP"表示获取栈顶元素==>返回2
"POP"表示弹出栈顶元素,弹出2,栈中元素为-1
"PSH1"表示将1压入栈中,栈中元素为1,-1
"TOP"表示获取栈顶元素==>返回1
"MIN"表示获取此时栈中最小元素==>返回-1
我的解法:
首先定义一个栈,一个数组,栈的作用是正常执行出栈、入栈、获取栈顶元素,数组的作用是更新当前栈中最小的元素。push(value)方法:首先,若当前栈为空,将value存入数组,执行入栈操作;若不为空,判断入栈元素是否小于等于数组中最后一个元素,若小于等于就将该元素存入数组,否则只执行入栈操作。pop()方法:在栈不为空的前提下,若栈顶元素等于数组中最后一个元素,则删除数组中最后一个元素,执行出栈操作。top()方法:也是在栈顶元素不为空的前提下,执行获取栈顶元素的操作。min()方法:直接返回数组中最后一个元素。
public class topic_2 {
Stack<Integer> stack = new Stack<>();
Integer[] min = new Integer[300];
int i = 0;
public void push(int node) {
if(stack.isEmpty()){
min[0] = node;
} else if(min[i]>=node){
i ++;
min[i] = node;
}
stack.push(node);
}
public void pop() {
if(!stack.isEmpty()){
if(stack.peek() == min[i])
i --;
stack.pop();
}
}
public int top() {
if(!stack.isEmpty())
return stack.peek();
return 10001;
}
public int min() {
return min[i];
}
官方的解法链接:官方讲解与代码