1.题目
剑指 Offer 09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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]
提示:
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用
2.自我思路及实现
将栈1作为入队列栈,栈2作为出队列栈, 当加入元素时直接压入栈1即可,当删除元素时,首先将栈1中的元素依次弹出并压入栈2,完成后栈2顶端元素即为要删除的元素,弹出,再将栈2中的元素依次弹出并压入栈1
时间:N,两次转移
空间:N
class CQueue {
Stack<Integer> stack1;
Stack<Integer> stack2;
public CQueue() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
if(stack1.isEmpty())
return -1;
//1转移到2
while( !stack1.isEmpty())
{
stack2.push(stack1.pop());
}
int cur = stack2.pop();
//2转移到1
while( !stack2.isEmpty())
{
stack1.push(stack2.pop());
}
return cur;
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
当进行连续出队列操作时,可以先不将栈2转移到栈1,而是在入队列操作时再转移,这样可以节省一点时间
class CQueue {
Stack<Integer> stack1;
Stack<Integer> stack2;
public CQueue() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void appendTail(int value) {
//2转移到1
while( !stack2.isEmpty())
{
stack1.push(stack2.pop());
}
stack1.push(value);
}
public int deleteHead() {
if(stack1.isEmpty() && stack2.isEmpty())
return -1;
//1转移到2
while( !stack1.isEmpty())
{
stack2.push(stack1.pop());
}
int cur = stack2.pop();
return cur;
}
}
3.总结思路及实现
上述思路的优化
不将栈2 元素转移到栈1中,因为入队列与栈1中是否有元素没有关系,栈2元素已经是倒序排列了,出队列时删除压出栈2顶端元素即可,当栈2为空的时候再将栈1 元素转移到栈2,如果栈2仍为空,那么此队列为空
class CQueue {
Stack<Integer> stack1;
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())
{
while(!stack1.isEmpty())
{
stack2.push(stack1.pop());
}
}
return stack2.isEmpty() ? -1 : stack2.pop();
}
}
4.相关知识
- 栈可以由本身实现或者链表实现