起初读题一直没明白题的意思,在题解中看到了白话文解释才明白。
应该考察栈(先进后出)、队列(先进先出)的特性。
这里2个栈,我的理解为,第一个为功能栈,第二个为辅助栈,根据栈先进后出的特点,用两个栈来实现队列的功能。
个人总结就是,首先数字压入第一个栈,此时栈1为空,栈2为空,比如依次进入 1、3、5 三个数字,此时栈1、栈2如图所示
如果此时想要删除头元素,也就是第一个进入的数字:1,那么就需要把栈1的三个元素,依次弹出(pop),压入栈2(push)中,此时栈1为空,栈2不为空,根据先进后出的原则,栈2变为如图所示
然后把1弹出(pop),这样就可以实现头元素的删除
因此,如果是实现添加元素,那么所有元素首先压入栈1
那么删除元素就要考虑栈2的情况,因为要想实现删除头元素,必须是栈1元素先弹出,然后压入栈2,此时栈2不为空,说明元素都在栈2,删除操作可以直接依次执行,也就不需要另加考虑。
根据题意,如果栈1、2均为空,删除操作返回-1
再考虑栈1、栈2的情况
①、栈2为空、栈1不为空
这种情况也就是栈1压入了新元素,此时栈1、栈2情况如图
那么此时的头元素就变成了7,要想删除7,首先要把栈2元素弹出压入栈1,再把栈1元素弹出压入栈2,那么7就在栈2的顶部,就可以实现删除操作了。
栈2元素依次弹出压入栈1:
栈1元素依次弹出压入栈2:
②、栈1为空、栈2不为空
直接弹出栈2栈顶元素,进行删除即可
至此个人思路题解结束,根据思路写出代码
class CQueue {
private Stack<Integer> stack1;
private Stack<Integer> stack2;
public CQueue() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
// 栈2为空
if (stack2.isEmpty()) {
//栈2为空、栈1不为空
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
//栈2空、栈1空
if (stack2.isEmpty()) {
return -1;
} else { //栈2不空
return stack2.pop();
}
}
}
isEmpty() 判断是否为空,如果栈是空的,则返回true,如果栈中含有元素,则返回false