前言:这是学习《程序员代码面试指南》一书的第一篇文章,也是博客的第一篇文章,给自己加油,从现在开始坚持记录学习。
设计一个有getMin功能的栈
题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小值的操作。
要求:1.pop、push、getMin操作的时间复杂度都是O(1)。
2.设计的栈类型可以使用现成的栈结构。
1.思路整理:
采用两个栈,
stackData作为数据栈保存数据;
stackMin作为辅助栈保存stackData数据栈中每一步的最小元素。
压入数据规则:
1.将数据newNum压入stackData数据栈中,执行下一步;
2.判断stackMin辅助栈是否为空,
若为空,将newNum同步压入stackMin辅助栈,执行下一步;
若不为空,直接执行下一步;
3.若 newNum <= stackMin.peek(),将newNum同步压入stackMin,
若 newNum > stackMin.peek(),结束操作
弹出数据规则:
1.判断stackData栈是否为空,
若为空,结束操作;
若不为空,弹出栈顶元素,执行下一步;
2.判断stackMin辅助栈是否为空,
若为空,结束操作
若不为空,直接执行下一步;
3.若 stackData栈顶元素 == getMin(),弹出stackMin栈顶元素
若 stackData栈顶元素 > getMin(),结束操作
(注:根据压入规则,stackData栈中元素 >= stackMin栈中元素,所以上面不必考虑小于的情况)
查询最小值操作:
根据以上规则, stackMin的栈顶元素始终是当前stackData栈的最小值
2.代码实现:
public class MyStack {
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public MyStack() {
this.stackData = new Stack<>();
this.stackMin = new Stack<>();
}
public void push(int newNum) {
if (this.stackMin.empty()) {
this.stackMin.push(newNum);
} else if(newNum<=this.getMin()){
this.stackMin.push(newNum);
}
this.stackData.push(newNum);
}
public int pop() {
if(this.stackData.empty()){
throw new RuntimeException("操作的栈为空");
}
if(this.stackData.peek() == this.getMin()){
this.stackMin.pop();
}
return this.stackData.pop();
}
public int getMin() {
if(this.stackMin.empty()){
throw new RuntimeException("操作的栈为空");
}
return this.stackMin.peek();
}
}