[程序源代码面试指南第二版] 设计一个有getMin功能的栈
需求:
- 栈的基本功能基础上
- 返回栈中最小元素操作
- pop时间复杂度O(1)
- push时间复杂度O(1)
- getMin时间复杂度O(1)
解题思路1
-
两个栈存放正常数据stackData和存放最小值stackMin
-
push 数据压入stackData,判断stackMin为空 2.1 如果stackMin为空,那么数据压入stackMin 2.2 如果stackMin不为空,判断新数据和stackMin栈顶元素哪个更小 2.2.1 stackMin更小,则stackMin不压入 2.2.2 新数据更小, push
-
pop stackData的元素只可能大于等于stackMin 所以value如果大于stackMin时stackMin不用弹出,返回value
-
getMin 返回stackMin栈顶就是最小值
注意点
- getMin()和pop()记得判断为空的清空记得判断异常
- push时用到判断当前stackMin当前栈顶 记得服用getMin函数
解题思路2
和思路1的差别在于新数据比stackMin栈顶大时,再压入stackMin的栈顶
附件
解题思路1
public class STACK_getMin {
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public STACK_getMin() {
this.stackData = new Stack<>();
this.stackMin = new Stack<>();
}
public void push(int newNum){
if(stackMin.isEmpty()){
stackMin.push(newNum);
}else{
//获取栈的顶
//复用函数
if(newNum <= getMin()){
stackMin.push(newNum);
}
}
stackData.push(newNum);
}
public Integer pop(){
// 注意异常
if(this.stackData.isEmpty()){
throw new RuntimeException("your stack is empty.");
}
int value = this.stackData.pop();
if(value == this.getMin()){
this.stackMin.pop();
}
return value;
}
public Integer getMin(){
if(this.stackMin.isEmpty()){
throw new RuntimeException("Your stack is Empty!!!");
}
return this.stackMin.peek();
}
public Stack<Integer> getStackMin() {
return stackMin;
}
public Stack<Integer> getStackData() {
return stackData;
}
}
解题思路2
public class STACK_getMin02 {
private Stack<Integer> stackData = new Stack();
private Stack<Integer> stackMin = new Stack();
public STACK_getMin02() {
}
public void push(int newNum) {
if (this.stackMin.isEmpty()) {
this.stackMin.push(newNum);
} else if (newNum <= this.getMin()) {
this.stackMin.push(newNum);
} else {
this.stackMin.push(this.stackMin.peek());
}
this.stackData.push(newNum);
}
public Integer pop() {
if (this.stackData.isEmpty()) {
throw new RuntimeException("your stack is empty.");
} else {
int value = (Integer)this.stackData.pop();
this.stackMin.pop();
return value;
}
}
public Integer getMin() {
if (this.stackMin.isEmpty()) {
throw new RuntimeException("Your stack is Empty!!!");
} else {
return (Integer)this.stackMin.peek();
}
}
public Stack<Integer> getStackData() {
return this.stackData;
}
public Stack<Integer> getStackMin() {
return this.stackMin;
}
}