重写一下栈的结构,要求具备入栈、出栈、求最小元素,复杂度都是o(1),
解题思路是用一个辅助栈存储每一次入栈时候的最小元素,出栈的时候,如果出栈的元素恰好是最小元素,则把辅助栈的栈顶元素删除。
需要注意的是,模板类型,不能指定成具体的类型,还有就是辅助找存放的是最小元素在数据栈中的位置,且辅助栈的元素数目时刻与数据栈中的元素的数目相等。
java代码
package stackAndQuence;
import java.util.Stack;
import org.omg.CORBA.PRIVATE_MEMBER;
public class stactMin {
public static class StackWithMin<T extends Comparable<T>> {
private Stack<T> dataStack;
private Stack<Integer> mindata; // 存储的是最小元素的位置
// 构造函数
public StackWithMin() {
this.dataStack = new Stack<>();
this.mindata = new Stack<>();
}
// 入栈
public void push(T t) {
if (t == null) {
System.out.print("error");
return;
}
if (dataStack.isEmpty()) {
dataStack.push(t);
mindata.push(0);
} else {
T tmp = dataStack.get(mindata.peek());
dataStack.push(t);
if (t.compareTo(tmp) < 0) {
mindata.push(dataStack.size() - 1);
} else {
mindata.push(mindata.peek());
}
}
}
// 出栈,保证数据栈和最小元素位置栈保持大小相等
public T pop() {
if (dataStack.isEmpty()) {
return null;
} else {
mindata.pop();
return dataStack.pop();
}
}
// 取最小元素
public T min() {
if (mindata.isEmpty()) {
throw new RuntimeException("No element in stack.");
} else {
return dataStack.get(mindata.peek());
}
}
}
public static void main(String[] args) {
StackWithMin<Integer> stack = new StackWithMin<>();
stack.push(3);
System.out.println(stack.min() == 3);
stack.push(4);
System.out.println(stack.min() == 3);
stack.push(2);
System.out.println(stack.min() == 2);
stack.push(3);
System.out.println(stack.min() == 2);
stack.pop();
System.out.println(stack.min() == 2);
stack.pop();
System.out.println(stack.min() == 3);
stack.push(0);
System.out.println(stack.min() == 0);
}
}