问题描述:
用两个队列模拟堆栈的操作(入栈与出栈)
思路:
我们知道队列是FIFO(先进先出),而栈是后进先出(LIFO)
要用两个队列实现堆栈我们可以这样做:
假设有A.B两个队列,开始都为空。那么:
入栈操作:
1,当A,B队列均为空时,直接将元素进入A队列。
2,当A,B队列有一个不为空时,将元素入队到不为空的那个队列中。
出栈操作:
1,当A,B 队列均为空时,出栈为Null。
2,当A,B队列有一个不为空时,将不为空的队列(假设为队列B)中的前N-1个元素依次入队到另一个队列(队列A)中,
再将B队列中剩下的最后的一个元素出队并返回之。
Java实现:
import java.util.LinkedList;
import java.util.Queue;
/**
* 双队列实现栈
*
* @author likebamboo
* @create 2013-10-21
* @param <E>
*/
public class MyStack<E> {
/**
* 队列A
*/
private Queue<E> qA;
/**
* 队列B
*/
private Queue<E> qB;
public MyStack() {
super();
qA = new LinkedList<E>();
qB = new LinkedList<E>();
}
/**
* 入栈操作
*
* @param item
*/
public void push(E item) {
// 如果B队列不为空,将元素入B队列
if (!qB.isEmpty()) {
qB.offer(item);
return;
}
// 如果两个队列均为空,或者A队列不为空,均将原始加入A队列
qA.offer(item);
}
/**
* 出栈操作
*
* @return
*/
public E pop() {
// 如果队列B不为空,那么将B队列中的前N-1个元素出队并进入A队。
// 并将B队列中的最后一个元素出队列并返回。
if (!qB.isEmpty()) {
while (qB.size() > 1) {
qA.offer(qB.poll());
}
return qB.poll();
}
// 如果队列B为空,那么不管A队列是否为空(为空时抛出异常也是合理的).
// 将A队列中前N-1个元素出队并进入A队列。再返回A队列中的最后一个元素。
while (qA.size() > 1) {
qB.offer(qA.poll());
}
return qA.poll();
}
/**
* 栈是否为空
*
* @return
*/
public boolean isEmpty() {
return qA.isEmpty() && qB.isEmpty();
}
public static void main(String[] args) {
MyStack<String> stack = new MyStack<String>();
stack.push("first");
System.out.println(stack.pop());
stack.push("second");
stack.push("third");
stack.push("fourth");
stack.push("fifth");
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
}
}