题目要求:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
相关知识:
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈(push),它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈(pop),它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
解题思路:
因此该题目可分解为两个小题目:(1)定义栈的结构即定义pop,push操作 (2)以时间复杂度为O(1)为条件,定义可得到栈中最小元素的函数。
因此我们使用空间来换取时间的策略,定义一个备用栈和实际的栈大小一样,但区别是每次入栈时存储的都是目前栈里最小的元素,后面出栈的时候依次出栈即可。
代码如下:
import java.util.Stack;
public class Solution {
private Stack<Integer> stackData = new Stack<Integer>();
private Stack<Integer> stackMinPts = new Stack<Integer>();
public void push(int node){
if(stackMinPts.isEmpty()||stackMinPts.peek()>=node){
stackMinPts.push(node);
}
else{
stackMinPts.push(stackMinPts.peek());
}
stackData.push(node);
}
public void pop(){
if(stackMinPts.isEmpty()||stackData.isEmpty()){
return;
}
stackData.pop();
stackMinPts.pop();
}
public int top(){
if(!stackMinPts.empty()){
return stackMinPts.peek();
}
else{
return 0;
}
}
public int min(){
if(!stackMinPts.empty()){
return stackMinPts.peek();
}
else{
return 0;
}
}
}