栈和队列
面试题9:用两个栈实现队列

解题思路
- 我们可以举一个实际的例子进行分析,记住栈是先进后出,队列是先进先出的规则;
- 首先初始化两个栈stack1和stack2(打算先将元素入栈stack1,然后再出栈到stack2),如果stack2不为空,那么删除队列头就等于弹出stack2的栈顶元素,如果stack2为空,那么就把stack1的元素逐个弹出并压入stack2中;插入到队列的尾部就可以直接 插入到stack1。
- 总结:第一个栈支持插入操作,第二个栈支持删除操作
源代码
class CQueue {
Deque<Integer> stack1 = new LinkedList<Integer>();
Deque<Integer> stack2 = new LinkedList<Integer>();
public CQueue() {
}
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
if (stack2.isEmpty()) {
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
if (stack2.isEmpty()) {
return -1;
} else {
return stack2.pop();
}
}
}
补充知识
- 栈的初始化:
Deque<Integer> stack = new LinkedList<Integer>();
- 方法:
- 入栈:push(e)
- 出栈:pop()
- 取栈顶元素:peek()
- 队列的初始化:
Queue<Integer> queue = new LinkedList<Integer>();
- 方法:
- 插入队头:offer(e);
- 队尾删除:poll();
- 取队尾元素:peek();