题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
解题思路
栈是先进后出的, 队列是先进先出的。
两个栈如何做到先进先出, 第一个栈记录所有的进堆顺序,然后当要出发第一个删除头结点的时候, 将第一个栈一个一个pop弹出到第二个栈, 也就是说第一个栈的最后一个进来的会第一个进入到第二个栈, 那么第一个栈最下面的节点数据就会在第二个栈的最上面, 那么此时在调用第二个栈的pop弹出, 就能获取到第一个进栈的数据了, 做到了先进先出!
还有一个问题, 当又来数据的时候, 数据应该先进入第一个栈去记录他的顺序, 当要删除头结点的时候, 我们需要判断第二个栈是否为空, 如果空的话, 将第一个栈一个一个pop到第二个栈,不然的话其实可以直接pop第二个栈, 请看第一段的解释
Java代码实现
import java.util.ArrayDeque;
import java.util.Deque;
class CQueue {
Deque<Integer> queueOne ;
Deque<Integer> queueTwo ;
public CQueue() {
queueOne = new ArrayDeque();
queueTwo = new ArrayDeque();
}
public void appendTail(int value) {
queueOne.add(value);
}
public int deleteHead() {
int res = -1;
if(!queueTwo.isEmpty()){
res = queueTwo.pop();
}else{
while(!queueOne.isEmpty()){
queueTwo.add(queueOne.pop());
}
if(!queueTwo.isEmpty()){
res = queueTwo.pop();
}
}
return res;
}
}