题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
题目链接:link.
分析
我看到很多人在题目评论说看不懂题目示例,可能是只看题目,没有看代码吧。这道题要我们实现一个类,这个类有三个方法,一个构造方法,一个appendTail,一个deleteHead。题目示例就是说明测试时的调用顺序,实例一就是:
initCQueue()
appendTail(3)
deleteHead()
deleteHead()
然后来看这道题,题目说的很清楚,用两个栈来实现一个队列。都说了两个。这个题就比较简单了,栈是先进后出,队列是后进先出,两个栈一个负责出栈,一个负责入栈。
题解
class CQueue {
LinkedList<Integer> stack1;
LinkedList<Integer> stack2;
public CQueue() {
stack1 = new LinkedList<>();
stack2 = new LinkedList<>();
}
public void appendTail(int value) {
stack1.add(value); // stack1 只负责入栈
}
public int deleteHead() { // stack2 只负责出栈
if (stack2.isEmpty()) { // 如果负责出的栈为空,将负责入的栈的全部元素放到负责出的栈
if (stack1.isEmpty()) return -1;
while (!stack1.isEmpty()) {
stack2.add(stack1.pop());
}
return stack2.pop();
}
else return stack2.pop(); // 负责出的栈不为空,pop
}
}
总结
一道简单题,弄清楚栈和队列的特点应该就没有什么问题了。