剑指-09
解题思路:
- 栈的特性的入栈在最下面,出栈元素在最上面,因此是先入后出
- 队列的特性是FIFO,先入先出
- 因为给了两个栈,因此可以通过栈1入栈作为队列的入口,栈2作为队列的删除口。栈2为空的时候,将栈1的元素依次出栈并依次入栈到2,这样的话栈2最上面的元素就会是整个抽象队列最开始添加的元素。
- 当存入的时候统一存入栈1,当删除的时候去栈2删除,如果栈2为空,则去栈1寻找元素,如果栈1也为空,那么返回-1
class CQueue {
// 添加栈
int[] stack_1;
int index_1;
// 删除栈
int[] stack_2;
int index_2;
public CQueue() {
stack_1 = new int[10000];
stack_2 = new int[10000];
index_1 = 0;
index_2 = 0;
}
public void appendTail(int value) {
stack_1[index_1++] = value;
}
public int deleteHead() {
if (index_1 == 0 && index_2 == 0) {
return -1;
}
if (index_2 > 0 ) {
int v = stack_2[index_2];
index_2 --;
return v;
} else {
// 将入栈元素倒入出栈元素中
for(int i = index_1; i >= 0;i --) {
stack_2[index_1 - i] = stack_1[i];
}
index_2 = index_1;
index_1 = 0;
int v = stack_2[index_2--];
return v;
}
}
}
Q.E.D.