1.思路分析
(1)首先我们要了解队列和栈的特点。
先来说栈,插入和取出操作都在一端进行,它的结构可以比作一个“弹夹”,导致它的特点是“先进后出”;
再说队列,插入在队尾操作,取出在队首操作,它的结构可以比作一个“单向隧道”,所以它的特点是“先进先出”。
(2)根据他的特点,可以用两个栈来模拟队列,具体的逻辑结构如下:
2.具体实现
(1)如何利用栈来执行队列的插入操作
- 代码演示:
class MyQueue<E> {
//创建两个栈
private Stack<E> in = new Stack<E>();
private Stack<E> out = new Stack<E>();
//判空
public boolean isEmpty() {
return in.size()==0 && out.size()==0;
}
//入队
public void offer(E e) {
//清空out栈,全都入in栈
while(!out.isEmpty()) {
in.push(out.pop());
}
//新元素入栈
in.push(e);
}
}
- 说明:
第一步:插入新元素时,先判断out栈是否为空,若不为空,把out栈里的元素全部转移到in栈(这样可以保证队列的特点:最先进入的元素应该最先出去即添加的新元素始终在“队首”)
第二步:当out栈为空之后,添加新元素至in栈,这时所有的元素都在in栈里面,并且顺序是最先进入的元素在栈底。
(2)如何利用栈来执行队列的取出操作
- 代码实现
//出队
public E poll() {
//清空in栈、入out栈
while(!in.isEmpty()) {
out.push(in.pop());
}
//出栈
return out.pop();
}
- 说明:
执行“出队”操作,即“先进先出”。用栈来表示:
第一步:把in栈里的元素先全部转移到out栈中
第二步:从out栈中取出所有元素
第三步:把第二步的结果作为“出队”操作的返回值即可。
总结:用两个栈作为中间缓存,只要保证“队列”的先进先出特性即可。