解题思路
栈无法实现队列功能:栈底元素(对于队首元素)无法直接删除,需要将上方所有元素出栈。
双栈可实现列表倒序: 设有含三个元素的栈 A = [1,2,3]A=[1,2,3] 和空栈 B = []B=[]。若循环执行 AA 元素出栈并添加入栈 BB ,直到栈 AA 为空,则 A = []A=[] , B = [3,2,1]B=[3,2,1] ,即 栈 BB 元素实现栈 AA 元素倒序 。
利用栈 B 删除队首元素: 倒序后,BB 执行出栈则相当于删除了 AA 的栈底元素,即对应队首元素。
函数设计:
题目只要求实现 加入队尾appendTail() 和 删除队首deleteHead() 两个函数的正常工作,因此我们可以设计栈 A 用于加入队尾操作,栈 B 用于将元素倒序,从而实现删除队首元素
复杂度分析:
由于问题特殊,以下分析仅满足添加 NN 个元素并删除 NN 个元素,即栈初始和结束状态下都为空的情况。
代码
class CQueue {
LinkedList<Integer>A, B;
public CQueue() {
A = new LinkedList<Integer>();
B = new LinkedList<Integer>();
}
public void appendTail(int value) {
A.addLast(value);
}
public int deleteHead() {
if(!B.isEmpty()) return B.removeLast();
if(A.isEmpty()) return-1;
while(!A.isEmpty())
B.addLast(A.removeLast());
return B.removeLast();
}
}