题解参考:文字 + 视频的方式详细讲解两个栈实现队列 - 用两个栈实现队列 - 力扣(LeetCode) (leetcode-cn.com)
第一次解题:失败
失败原因 看源码👇
class CQueue {
private Stack<Integer> stack1;
private Stack<Integer> stack2;
public CQueue() {
this.stack1 = new Stack<>();
this.stack2 = new Stack<>();
}
public void appendTail(int value) {
this.stack1.push(value);
}
public int deleteHead() {
// 再删除过程中 考虑不周全
// 没有考虑到: 栈2有元素时(不为空) 应该直接弹出 栈2中的元素
// 而是 直接向栈2填充 这样是不对的
while (!stack1.isEmpty()) {
// 栈1不为空 则向栈2填充
stack2.push(stack1.pop());
}
if (stack2.isEmpty()) {
return -1;
}
return stack2.pop();
}
}
第二次解题:成功
class CQueue {
private Stack<Integer> stack1;
private Stack<Integer> stack2;
public CQueue() {
this.stack1 = new Stack<>();
this.stack2 = new Stack<>();
}
public void appendTail(int value) {
this.stack1.push(value);
}
public int deleteHead() {
//在删除过程中 多做判断
//若 栈2不空 直接弹出
//若 栈2空 栈1不空 则先将栈1移入栈2 再弹出
//若 栈2空 栈1空 则 return -1;
if (!stack2.isEmpty()) {
return stack2.pop();
} else if (!stack1.isEmpty()) {
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
return stack2.pop();
}else return -1;
}
}