面试题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 次调用
解题思路:用两个栈,stackA用来存储数据,stackB用来辅助,如果stackA为空,添加元素时直接入栈即可,如果stackA不为空,则将stackA中所有数据按出栈顺序存入stackB中,再将要添加的元素放入stackA中,最后再将stackB中所有数据按出栈顺序存入stackA中,这样可以使队列的头部元素始终在栈顶,尾部元素始终在栈底。方便删除。
代码如下:
class CQueue {//创建两个栈
private LinkedList<Integer> stackA;
private LinkedList<Integer> stackB;
public CQueue() {//构造函数
stackA = new LinkedList<Integer>();
stackB = new LinkedList<Integer>();
}
//入队操作
public void appendTail(int value) {
while(!stackA.isEmpty()){ //若stackA不为空,则移入stackB中
stackB.push(stackA.pop());
}
stackA.push(value); //将要添加的元素存入stackA中
while(!stackB.isEmpty()){ //再将stackB中元素一会stackA中
stackA.push(stackB.pop());
}
}
public int deleteHead() { //若stackA为空,则返回-1
if(stackA.isEmpty()){
return -1;
}else{ //若stackA不为空,则返回stackA栈顶元素
return stackA.pop();
}
}
}