问题描述:
用两个堆栈模拟队列的操作(入队与出队)。
思路:
我们都知道队列是一种 先进先出(FIFO) 的数据结构, 栈是一种 后进先出(LIFO) 的数据结构,
要用两个栈实现一个队列,可以这样设想:
假设两个栈 a 和b,最初的时候,a,b都为空栈。
假设栈 a 为提供入队列的功能,栈 b 提供出队列的功能。
入队列:
1,如果栈 b 为空,直接将元素压入栈a 。
2,如果栈 b 不为空,首先依次弹出栈 b 的元素,压入栈 a 中,再将要压入的元素压入栈 a 。
出队列:
1,如果栈 a 为空,直接弹出栈 b 的栈顶元素(如果栈b也为空,抛出异常)。
2,如果栈 a 不为空,则依次弹出栈 a 的元素,放入栈 b 中,再弹出栈 b 的栈顶元素。
Java 实现:
import java.util.Stack;
/**
* 用两个堆栈模拟队列的操作(入队与出队)。
*
* @author likebamboo
* @create 2013-10-21
* @param <E>
*/
public class MyQueue<E> {
/**
* A栈
*/
private Stack<E> stackA;
/**
* B栈
*/
private Stack<E> stackB;
public MyQueue() {
super();
stackA = new Stack<E>();
stackB = new Stack<E>();
}
/**
* 出队操作
*
* @return
*/
public E poll() {
// 如果A栈为空,那么返回B栈的栈顶元素
if (stackA.isEmpty()) {
return stackB.pop();
}
// 如果A栈不为空,首先将A栈的元素压入B栈
while (!stackA.isEmpty()) {
stackB.push(stackA.pop());
}
return stackB.pop();
}
/**
* 入队列操作
*
* @param item
*/
public void offer(E item) {
// 如果栈B为空,直接压入A栈
if (stackB.isEmpty()) {
stackA.push(item);
return;
}
// 如果栈B不为空,首先将栈B中的元素压入A中。
while (!stackB.isEmpty()) {
stackA.push(stackB.pop());
}
stackA.push(item);
}
/**
* 判断队列是否为空
*
* @return
*/
public boolean isEmpty() {
return stackA.isEmpty() && stackB.isEmpty();
}
public static void main(String[] args) {
MyQueue<String> q = new MyQueue<String>();
boolean isEmpty = q.isEmpty();
if (isEmpty) {
q.offer("the first str");
q.offer("the second str");
System.out.println(q.poll());
q.offer("the third str");
System.out.println(q.poll());
q.offer("the fourth str");
q.offer("the fifth str");
System.out.println(q.poll());
System.out.println(q.poll());
}
}
}