题目:可以用栈的数据结构。实现一个可以返回最小值的栈的api,有push pop top min方法。
public void push(int x)
public void pop()
public int top()
public int min()
思路:用两个栈stackA和stackB。
- 既然还需要实现一个栈的push和pop和top功能,所以这些元素肯定都要放到stackA中来用它来实现这些方法(因为stackA本来就是个栈)。那stackB就自然用来实现min方法。
- 当push时stackA先push一下,由于stackB里叠加的存放此刻的最小值,所以当stackB为empty或x小于等于stackB.peek()时就stackB再push一下。(x等于的时候也要push,否则当有两个一样的x情况下stackB最小的就放一个,那pop一下最小值就不对了,就出问题了)。
- 当pop时考虑stackA为empty的情况,当stackA不为empty时stackB也不为empty。当stackA.peek()为tempNum变量(要拿临时变量保存,否则两个.peek() 用 ‘==’ 比较的是对象,就出问题了)与stackB.peek()相等时,把stackB.pop()一下。然后stackA一定要pop,放到最后。
- top和min方法,考虑一下为empty的情况,分别返回stackA和stackB的peek()就好。
class MinStack {
//类属性变量(对象类型)会初始化为null
private Stack<Integer> stackA;
private Stack<Integer> stackB;
/** initialize your data structure here. */
public MinStack() {
stackA = new Stack<>();
stackB = new Stack<>();
}
/*
stackA实现一个栈的正常操作,stackB来可叠加地保存min值
*/
public void push(int x) {
stackA.push(x);
//x等于也放入,要不pop时要pop两个相同的,如果只放一个就发生了错误
if(stackB.isEmpty() || x <= stackB.peek()){
stackB.push(x);
}
}
public void pop() {
if(stackA.isEmpty()){
return;
}
//先用tempNum给接收过来,要不可能会出问题
int tempNum = stackA.peek();
if(tempNum == stackB.peek()){
stackB.pop();
}
stackA.pop();
}
public int top() {
if(stackA.isEmpty()){
return -999;
}
return stackA.peek();
}
public int min() {
if(stackA.isEmpty()){
return -999;
}
return stackB.peek();
}
}