两个栈,一个维护递减序列,一个维护递增序列。一个的栈顶是该栈中最小的元素,一个的栈顶是该栈中最大的元素,且最大的元素小于另一个栈顶最小的元素
每次push时可以看作一个拨算盘的过程,使得最小顶大于val,最大顶小于val,然后插入栈顶即可
pop时则需要把算盘的最大顶的一边全部拨过来,然后取栈顶即可
class SortedStack {
Deque<Integer> d1;
Deque<Integer> d2;
public SortedStack() {
d1 = new LinkedList<>();
d2 = new LinkedList<>();
}
public void push(int val) {
while(d1.size() > 0 && d1.getLast() < val){
d2.addLast(d1.getLast());
d1.removeLast();
}
while(d2.size() > 0 && d2.getLast() > val){
d1.addLast(d2.getLast());
d2.removeLast();
}
d1.addLast(val);
}
public void pop() {
while(d2.size() > 0){
d1.addLast(d2.getLast());
d2.removeLast();
}
if(d1.size() > 0)
d1.removeLast();
}
public int peek() {
while(d2.size() > 0){
d1.addLast(d2.getLast());
d2.removeLast();
}
return d1.size() == 0 ? -1 : d1.getLast();
}
public boolean isEmpty() {
if(d1.size() == 0 && d2.size() == 0)
return true;
return false;
}
}