题目描述:
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返
回栈中最小元素的操作。
【要求】
1.pop、push、getMin操作的时间复杂度都是O(1)。
2.设计的栈类型可以使用现成的栈结构。
思路:有两种方式的实现,都需要准备两个栈,一个stackData,一个stackMin,
第一种方式是:
在进行压栈操作时,如果栈为空,则分别将这个元素压入到这两个栈中,在以后进行压栈的操作中,比较该元素和stackMin栈的栈顶,如果小于或者等于该栈的栈顶,则将该元素分别压入stackMin栈和stackData栈中,如果大于该栈的栈顶,则只压入stackData栈中,总的来说就是保证stackMin栈的栈顶元素永远是所有元素的最小值。
在进行出栈操作时,都从stackData栈中弹出元素,如果该栈弹出的元素和stackMin栈的栈顶元素相等,则stackMin栈也弹出元素,如果不相等,那么只从stackData栈中弹出元素
第二种方式:
与第一种方式的总体思路是一样的,都是保证stackMin栈的栈顶元素为所有元素中的最小值,在压栈和出栈的过程中有所不同,
在进行压栈时,比较该元素和stackMin栈的栈顶,如果小于或者等于该栈的栈顶,则将该元素分别压入stackMin栈和stackData栈中,如果大于该栈的栈顶,则将该元素压入stackData栈中,将stackMin栈此时的栈顶元素压入到stackMin栈中,
出栈时,两个栈同时出栈
import java.util.Stack;
public class Code_004_GetMinStack {
public static class GetMinStack1 {
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public GetMinStack1() {
stackData =new Stack<>();
stackMin = new Stack<>();
}
public void push(int obj) {
if (stackMin.isEmpty()) {
stackMin.push(obj);
} else if (obj <= stackMin.peek()) {
stackMin.push(obj);
}
stackData.push(obj);
}
public int pop() {
if (stackData.isEmpty()) {
throw new RuntimeException("Stack is empty");
} else if (stackData.peek() == stackMin.peek()) {
stackMin.pop();
}
return stackData.pop();
}
public int getMin() {
if (this.stackMin.isEmpty()) {
throw new RuntimeException("Stack is empty.");
}
return stackMin.peek();
}
}
public static class GetMinStack2 {
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public GetMinStack2() {
stackData = new Stack<>();
stackMin = new Stack<>();
}
public void push(int obj) {
if (stackMin.isEmpty()) {
stackMin.push(obj);
} else if (obj <= stackMin.peek()) {
stackMin.push(obj);
} else {
stackMin.push(stackMin.peek());
}
stackData.push(obj);
}
public int pop() {
if (stackData.isEmpty()) {
throw new RuntimeException("Stack is empty");
}
stackMin.pop();
return stackData.pop();
}
public int getMin() {
if (this.stackMin.isEmpty()) {
throw new RuntimeException("Stack is empty.");
}
return stackMin.peek();
}
}
}