题目
该系列文章题目和思路均参考自:《剑指Offer》
解法
使用两个栈实现一个队列的插入和删除的操作,插入和删除的实现思路如下:
- 插入操作,插入一个元素即可以直接将他入stack1栈。
- 删除操作,如果stack2为空,则将stack1中的元素全部出栈并入stack2,然后pop出第一个元素。如果stack2不为空,则直接弹出stack2中的第一个元素即可。
代码实现:
/**
* 面试题9:两个栈实现一个队列
* @param <E>
*/
public class StackImplementQueue <E> {
private Stack<E> s1 = new Stack<>();
private Stack<E> s2 = new Stack<>();
public synchronized void put(E e) {
s1.push(e);
}
public synchronized E pop() {
if (s2.isEmpty()) {
while (!s1.isEmpty()) {
s2.push(s1.pop());
}
}
return s2.pop();
}
public synchronized boolean empty() {
return s1.isEmpty() && s2.isEmpty();
}
public static void main(String[] args) {
StackImplementQueue<Integer> queue = new StackImplementQueue<>();
for (int i = 0; i < 10; i++) {
queue.put(i);
}
while (!queue.empty()) {
System.out.println(queue.pop());
}
}
}