题目:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。
思路:
1.用一个值来保存最小值是行不通的,因为栈pop操作后,最小值就变了。可以把每次的最小元素(之前的最小元素和新压入栈的元素两者的较小值)都保存起来放到另外一个辅助栈里。
2.每次push操作时,将当前最小值与新元素对比得出新的最小值,同时push进minStack。
每次pop操作时,两个栈同时pop。
基于以上思路,参考代码如下:
package chapter4;
import java.util.ArrayDeque;
public class P165_GetMinStack {
private ArrayDeque<Integer> stack1=new ArrayDeque<>();
private ArrayDeque<Integer> stack2=new ArrayDeque<>();
public void push(int val){
stack1.addFirst(val);
if(stack2.isEmpty()){
stack2.addFirst(val);
}else {//not null
stack2.addFirst(val<stack2.peekFirst()?val:stack2.peekFirst());
}
}
public int pop(){
if(stack1.isEmpty()||stack2.isEmpty()){
throw new RuntimeException("Stack is empty !");
}
int res=stack1.pollFirst();
stack2.pollFirst();
return res;
}
public int getMin(){
if(stack2.isEmpty()){
throw new RuntimeException("Stack is empty !");
}else {
return stack2.peekFirst();
}
}
public static void main(String[] args) {
P165_GetMinStack stack=new P165_GetMinStack();
stack.push(3);
stack.push(4);
stack.push(2);
stack.push(1);
stack.push(0);
System.out.println(stack.getMin());
stack.pop();
System.out.println(stack.getMin());
stack.pop();
System.out.println(stack.getMin());
stack.pop();
System.out.println(stack.getMin());
stack.pop();
}
}
测试用例:
a.新压入栈的数字比之前的最小值大。
b.新压入栈的数字比之前的最小值小。
c.弹出栈的数字不是最小元素。
d.弹出栈的数字是最小元素。
参考:
https://blog.csdn.net/grace_fang/article/details/79455042
https://blog.csdn.net/qq1263292336/article/details/76166165