题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
思路
维护两个栈,第一个栈存储元素,第二个栈用于辅助操作。
根据栈的特性,第一个栈的底部元素是最后插入的元素(appendTail),顶部元素是下一个被删除的元素(deleteHead)。为了维护队列的特性,每次插入的元素应该在第一个栈的底部。因此每次插入元素时,若第一个栈内已经有元素,应将已有的全部元素依次弹出并压入第二个栈,然后将新元素压入第一个栈,最后将第二个栈内的全部元素依次弹出并压入第一个栈。经过上述操作,新插入的元素在第一个栈的底部,第一个栈内的其余元素的顺序和插入元素之前保持一致。
删除元素时,若第一个栈非空,则直接从第一个栈内弹出一个元素并返回,若第一个栈为空,则返回 -1。
另外维护队列的元素个数,用于判断队列是否为空。初始元素个数为 0。每次插入元素,元素个数加 1。每次删除元素,元素个数减 1。
实现
class CQueue {
Stack<Integer> stack1;
Stack<Integer> stack2;
int size;
public CQueue() {
stack1 = new Stack<Integer>();
stack2 = new Stack<Integer>();
size = 0;
}
public void appendTail(int value) {
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
stack1.push(value);
while (!stack2.isEmpty()) {
stack1.push(stack2.pop());
}
size++;
}
public int deleteHead() {
if (size == 0) {
return -1;
}
size--;
return stack1.pop();
}
}