剑指offer(牛客网)-第五题-用两个栈实现队列
题目
用两个栈实现一个队列。
解析
- 队列是先进先出的,栈是先进后出的
- 通过一个具体的例子来分析该队列插入和删除元素的过程
- 首先插入一个元素a,不妨先插入stack1,此时stack1中的元素为{a},stack2为空。再压入两个元素b,c,还是插入到stack1中,此时stack1中的元素有{a,b,c},c位于栈顶,此时stack2还是为空。
- 这时从队列中删除一个元素。因为是先进先出,我们可以将stack1中的元素依次出栈入栈到stack2中,从stack2中弹出元素来做删除。
- 若此时又压入一个元素到stack1中,stack2不为空,要怎么做删除呢?这个时候stack2中的元素应该是先进入队列的元素,因此,应该先弹出stack2中的元素,直到stack2为空,才将stack1中的元素再出栈入栈到stack2中。
代码
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
}
public int pop() {
if (stack2.isEmpty()) {
while (! stack1.isEmpty())
stack2.push(stack1.pop());
}
return stack2.pop();
}
}
拓展
如何使用两个队列来实现一个栈
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
private Queue<Integer> queue1 = new LinkedList<Integer>();
private Queue<Integer> queue2 = new LinkedList<Integer>();
public void push(int node) {
queue1.offer(node);
}
public int pop() {
if (queue2.isEmpty()) {
while (!queue1.isEmpty())
queue2.offer(queue1.poll());
}
return queue2.poll();
}
}