用两个栈实现一个队列。
由于栈的特性是后进先出,而队列的特性是先进先出。
当A栈从栈底到栈顶依次有元素1,2,3。而要模拟队列时,出队列必需是1,2,3。此时,则可以将栈A中的元素依次弹出,进入栈B,则形成3,2,1的顺序,再从栈B弹出时就是1,2,3的顺序了。
有了这个思想就可以写出如下代码:
// 用于进队列
Deque<Integer> first = new ArrayDeque<Integer>();
// 用于出队列,出队的元素必需从此栈弹出。如果为空时将first栈中的元素入栈。
Deque<Integer> second = new ArrayDeque<Integer>();
public CQueue() {
}
// 元素进队列
public void appendTail(int value) {
first.push(value);
}
// 元素出队列
public int deleteHead() {
// 出队列时如果s2是空,就需要把s1的数据导过来。
if (second.isEmpty()) {
while (!first.isEmpty()) {
second.push(first.pop());
}
}
// 出队的元素必需经过second栈
return second.isEmpty() ? -1 : second.pop();
}
此题主要是理解栈的后进先出及队列的先进先出特点。