剑指 offer 09. 用两个栈实现队列(双栈)
程序员文章站
2022-06-17 17:47:46
...
1. 题目描述
2. 解题思路
- 为了体现队列先进先出的特点,选择使用两个栈来实现。
- 栈1只用来存,栈2只用来取。
在执行删除操作的时候我们首先看下第二个栈是否为空。如果为空,我们将第一个栈里的元素一个个弹出插入到第二个栈里,这样第二个栈里元素的顺序就是待删除的元素的顺序,要执行删除操作的时候我们直接弹出第二个栈的元素返回即可。
重点讲一下删除方法:
当栈2不为空时,直接弹出一个即可
如果栈2为空,就需要去拿栈1里面的数
如果栈1不为空,就依次弹出并压入栈2,并取出一个
如果栈1为空,则返回-1
3. 代码
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() {
if(!stack2.isEmpty()){ //不为空,直接取
return stack2.pop();
}else{ //取栈为空
while(!stack1.isEmpty()){ //将存栈转移到取栈
stack2.push(stack1.pop());
}
return stack2.isEmpty() ? -1 : stack2.pop();
}
}
}
4.结果