在我的上一篇博客中实现了两个栈实现队列的功能采用两个栈实现队列功能
使用两个队列实现栈
实现思路分析:
1)假设使用队列q1和队列q2模拟栈S,q1为入队列,q2为出队列。
2)认为q1提供入队列的操作,使用q2提供出队列的操作。
3)当需要入队列的时候,直接将数据压入q1栈中即可。
4)当需要从队列中取出数据的时候,就需要分情况考虑了。
5)若队列q1中只有一个元素,则直接让q1中元素出栈并输出。
6)若队列q1中不止一个元素,那么将q1中的元素弹出至q2直到q1中只剩下一个元素为止,然后弹出q1中的元素并输出,最后将q2中的元素继续在弹出到q1中。
代码实现:
public class TwoQueueToStack<E> {
Queue<E> q1 = new ArrayDeque();
Queue<E> q2 = new ArrayDeque();
public synchronized void put(E e) {
q1.add(e);
}
public synchronized E pop() {
if (isEmpty()) {
return null;
}
E e = null;
if (q1.size() == 1) {
return q1.poll();
} else if (q1.size() == 0) {
return null;
} else {
while (q1.size() != 1) {
q2.add(q1.poll());
}
e = q1.poll();
while (q2.size() == 0) {
q1.add(q2.poll());
}
}
return e;
}
public synchronized boolean isEmpty() {
return q1.isEmpty();
}
}