有两个栈a和b。栈a中数据是无序,栈b无数据。现在需要把a中的数据移动到b,并且最后b是有序的(栈顶最小)。要求:空间复杂度为O(1).
private static void fun(Stack<Integer> a, Stack<Integer> b) {
while (!a.isEmpty()){
Integer one = a.pop();//弹出待插入元素
if(b.isEmpty()){// b为空则直接插入
b.push(one);
continue;
}
if(one<=b.peek()){ //b不为空,如果插入元素比栈顶小则直接放入栈b
b.push(one);
continue;
}
int counter =0;//否则则查找这个元素再b中的位置,计数器。
while (!b.isEmpty()&&one>b.peek()){
a.push(b.pop());
counter++;
}
b.push(one);
for (int i = 0; i < counter; i++) {
b.push(a.pop());
}
}
}
说明:核心在空间复杂度为O(1),因此也就先把所有数据放到数组,然后再数组中排序,在入栈到b。我们把a中的每个元素插入到b中,如果要维持b一直都是有序的,就要解决,a弹出一个元素,如果需要把这个元素插入到b中间。那么就需要把b弹出一些元素。因此只能把这些元素存入a中,同时用一个计数器记录个数。等元素插入后,再弹回来。