设计一个有getMin功能的栈(返回栈中的最小元素)
算法要求:实现一个特殊的栈,在实现栈的基本功能的基础上,添加能够实现返回栈中最小元素的栈,要求算法的时间复杂读为O(1),即在常数时间内实现。
思路:在一个栈中在时间复杂读度为O(1)返回栈中最小元素是不可能实现的额,因此借助另一个栈,即用2个栈实现,一个栈和普通的栈一样,存放元素,另一个专门用来存放栈中最小元素。
算法过程:定义2个普通的Stack栈,一个用于普通操作栈,一个用来存放栈中的最小元素,即为stackMin,这个最小元素默认是栈中第一个元素,当新添加进来的元素小于于stackMin栈中的元素时,将这个元素添加进来,到最后stackMin栈中存放的就是栈中最小元素。
算法的java代码实现如下:
public class Stack_GetMin {
public static void main(String[] args) {
MyStack stackMin = new MyStack();
stackMin.push(5);
stackMin.push(3);
stackMin.push(-9);
stackMin.push(6);
stackMin.push(9);
stackMin.push(7);
int minValue = stackMin.getMinValue();
System.out.println("存放原始数据"+stackMin);
System.out.println(minValue);
}
}
class MyStack extends Stack<Integer>{
Stack<Integer> stackMin = new Stack<>();
@Override
public Integer push(Integer item) {
if (stackMin.empty()) {
stackMin.push(item);
}
else if (item<=stackMin.peek()) {
stackMin.push(item);
}
return super.push(item);
}
@Override
public synchronized Integer pop() {
if (lastElement()==stackMin.peek()) {
stackMin.pop();
}
return super.pop();
}
public int getMinValue() {
System.out.println("存放最小元素"+stackMin);
return stackMin.peek();
}
}