题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
思路1:stack2模拟队列的输出顺序,插入元素前,将保留先前的元素的stack2出栈到stack1
代码:
class CQueue {
Deque
Deque
public CQueue() {
stack1 = new LinkedList
stack2 = new LinkedList
}
public void appendTail(int value) {
while(!stack2.isEmpty()){
stack1.push(stack2.pop());
}
stack1.push(value);
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
public int deleteHead() {
if(stack2.isEmpty()){
return -1;
}
return stack2.pop();
}
}
分析:每个元素的插入操作和删除操作的时间复杂度分别为O(n)、O(1)
思路2: stack1负责插入元素,stack2负责模拟队列的输出
代码:
class CQueue {
Deque
Deque
public CQueue() {
stack1 = new LinkedList
stack2 = new LinkedList
}
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();
}
}
}
分析:每个元素的插入操作和删除操作的时间复杂度分别为O(1)、O(1)