面试题09. 用两个栈实现队列
方法:一个栈存储元素,一个栈辅助
过程分析
- 假设栈1是要实现的队列,我们新增元素时要加在栈1底,如果栈1为空时可以直接添加, 如果栈1有值需要先把栈1的值按顺序压入栈2,添加元素之后,再由栈2压入栈1,根据栈的特性, 经过2次出栈入栈过程后,栈1的元素顺序不变
- 使用元素个数判断是否为空,初始大小为0,添加元素size+1,删除元素size-1
复杂度分析
- 插入元素
时间复杂度:O(n)O(n)。插入元素时,对于已有元素,每个元素都要弹出栈两次,压入栈两次,因此是线性时间复杂度。 空间复杂度:O(n)O(n)。需要使用额外的空间存储已有元素
- 删除元素
时间复杂度:O(1)O(1)。判断元素个数和删除队列头部元素都使用常数时间。 空间复杂度:O(1)O(1)。从第一个栈弹出一个元素,使用常数空间
class CQueue {
Stack<Integer> stack1 = null;
Stack<Integer> stack2 = null;
int size;
/**
* 初始化栈
*/
public CQueue() {
stack1 = new Stack<Integer>();
stack2 = new Stack<Integer>();
size = 0;
}
public void appendTail(int value) {
while (!stack1.isEmpty())
// 把栈1的元素压入栈2
stack2.push(stack1.pop());
stack1.push(value);
size ++;
while (!stack2.isEmpty())
// 把栈2的元素压入栈1
stack1.push(stack2.pop());
}
public int deleteHead() {
if (stack1.isEmpty())
return -1;
size --;
return stack1.pop();
}
}