剑指offer09: 用两个栈实现队列
1、题目
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]
2、代码
2.1、方案1:暴力破解
class CQueue {
//声明两个栈
private Stack<Integer> stack1;
private Stack<Integer> stack2;
public CQueue() {
//实例化栈
stack1 = new Stack<>(); //用于入队
stack2 = new Stack<>(); //用于出队
}
//入队
public void appendTail(int value) {
while(!stack2.isEmpty()) {//当栈2不空时,元素搬回栈1,直到搬完
stack1.push(stack2.pop());
}
stack1.push(value); //栈2为空,元素入队
}
//出队
public int deleteHead() {
while(!stack1.isEmpty()) {//当栈1不空,元素搬入栈2,直到搬完
stack2.push(stack1.pop());
}
if(stack2.isEmpty()) {//无元素可出队
return -1;
}
return stack2.pop(); //有元素可出队
}
}
2.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() {
if(stack2.isEmpty()) {//栈2为空,从栈1中搬入元素,直到搬完
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
if(stack2.isEmpty()) {//栈1中元素搬完之后,栈2还为空,则无元素可出队
return -1;
}else {//栈1中元素办完之后,栈2不空了,则元素直接出队
return stack2.pop();
}
}
}
3、随笔
3.1、创建栈
Stack<Integer> stack = new Stack<>();
3.2、两个算法的时间复杂度
方案1:
入队时间复杂度为O(n)
出队时间复杂度为O(n)
方案2:
入队时间复杂度为O(1)
出队时间复杂度为O(n)
结语
如果你喜欢我写的文章,欢迎来踩我个人搭建的博客~
ChengNing’s Blog