目录
前言
队列(Queue)的特点是先进先出(FIFO : Fitst In First Out),而栈(Stack)的特点是后进先出(FILO : Fitst In Last Out)二者的操作特点完全不同。
实现思路
首先,我们应该创建一个类MyQueue,这个类一定要有两个最重要的方法,offer()将元素入队,poll()将元素取出。由于栈的特点是先进后出,因此一个栈是无法实现队列先进先的特点的。
我们可以在MyQueue中创建两个栈,元素入队栈“in”,元素出队栈“out”。当向MyQueue中第一次添加一个或者多个“A,B,C,D”元素时,可直接将元素加入到“in”中,即实现了元素入队MyQueue
当我们要取出元素时,显然不能从“in”栈里面取,因为此时取出元素的顺序为“D,C,B,A”,我们可以把“in”栈中的元素再“倒入”栈“out”中,此时就会有这样一个效果:
显然,现在元素出栈“out”,即是我们想要的元素出 队列MyQueue,如果我们只让部分元素出队列,比如只让“A”出队列。然后让元素“E”入队,此时“in”中为空,而out中还有“B,C,D”,:
所以我们应该将out中的元素再次倒入“in”中,然后再让元素“E”入栈“in”即实现“E”入队MyQueue:
同理,之后再让元素出队MyQueue,则继续将“in”中的元素“倒入” “out”中,让元素出栈“out”,即可实现元素出队MyQueue。总之,实现元素进出队列“MyQueue”,是让元素在“in”和“out”中来回“倒”后完成的,二者相当于是两只“水杯”,哈哈!
我们可以再给MyQueue提供判断队列是否为空的方法。只要判断栈“in”和栈“out”中的元素为空,那么队列即为空。有了这个方法,就可以遍历队列MyQueue了。
实现代码
public class Demo { public static void main(String[] args) { MyQueue<String> queue = new MyQueue<String>(); queue.offer("A1"); queue.offer("A2"); queue.offer("A3"); queue.offer("A4"); System.out.println(queue.poll()+"出队"); queue.offer("A5"); while(!queue.isNull()) { System.out.println(queue.poll()); } } } class MyQueue<E> { private Stack<E> in= new Stack<E>(); //入堆栈 private Stack<E> out= new Stack<E>(); //出队栈 public boolean isNull() {//判断队列是否为空 // return in.isEmpty()&&out.isEmpty(); return in.size()==0&&out.size()==0; } // 入队方法 public void offer(E e) { while(!out.isEmpty()) { in.push(out.pop()); } in.push(e); } // 出对方法 public E poll() { while(!in.isEmpty()) { out.push(in.pop()); } return out.pop(); } }
总结
用栈模拟队列需要两个栈,“in和out”,当向队列中添加元素时,要让“out”栈为空,即把元素都放入“in”栈中后,再添加元素,当元素从队列中出队时,要让“in”栈中元素为空。即把所有元素都放入“out”栈中,然后在元素出队。